Включение немодульного заголовка внутри модуля фреймворка

Я использую Xcode 6,

1) Сначала я создаю динамическую библиотеку (CoreLibrary). Эта библиотека содержит файл RequestPoster.h.

2) Затем я создаю Cocoa Touch Framework и добавил эту динамическую библиотеку (CoreLibrary).

3) Затем этот фреймворк добавляется в мой проект и выдает ошибку в файле RequestPoster.h (CoreLibrary).

Ошибка: включение немодульного заголовка в класс модуля фреймворка:

ifaddrs.h, arpa / inet.h, sys / types.h>

Эти файлы не найдены в проекте.

24 ответа

Убедитесь, что файлы заголовков общедоступны как часть открытых заголовков фреймворка.

Перейти к Framework -> Target -> Build Phases и перетащите, чтобы переместить соответствующие файлы заголовков из Project в Public. Надеюсь, это поможет!

Скриншот

Попробуйте установить параметры сборки в разделе "Цель" и установить для параметра "Разрешить немодульные включения в модули платформы" значение YES.

Реальный ответ заключается в том, что местоположение импорта должно быть изменено владельцем библиотеки. Эти файлы ifaddrs.h, arpa / inet.h, sys / types.h импортируются в файл.h в рамках, что не нравится Xcode. Сопровождающий библиотеку должен переместить их в файл.m. Посмотрите, например, эту проблему на GitHub, где AFNetworking исправила ту же проблему: https://github.com/AFNetworking/AFNetworking/issues/2205

Вы можете установить для параметра Разрешить немодульные включения в модулях платформы в настройках сборки значение "ДА". Это настройка сборки, которую нужно отредактировать:

Пункт настроек сборки, который нужно отредактировать

ПРИМЕЧАНИЕ. Эту функцию следует использовать для выявления основной ошибки, которая, как я обнаружил, часто вызывается дублированием глобальных включений в квадратных скобках в файлах с некоторым зависимым отношением, а именно:

#import <Foo/Bar.h> // referred to in two or more dependent files

Если установка " Разрешить немодульное включение в Frame Modules" на YES приводит к набору ошибок "X является неоднозначной ссылкой" или к чему-то в этом роде, вы должны быть в состоянии отследить дублирующиеся дубликаты и устранить их. После того, как вы очистили свой код, установите для параметра Разрешить немодульные включения в Frame Modules значение NO.

У меня была та же проблема, и я решил ее, просто сделав файл заголовка общедоступным. Проблема

Если вы работаете над несколькими модулями в вашем проекте. Тогда ваш заголовочный файл должен быть общедоступным для использования в других частях проектов. Вам нужно выбрать этот заголовочный файл и в представлении проекта Utilities. Измените файл с Project/Private на Public. Смотрите изображение ниже:

Изменение области заголовка файла

Allow Non-modular Includes in Framework Modulesработает только в коде objc. не работать в быстром темпе.

После периода исследований я обнаружил, что swift может передавать параметр предупреждения в clang, поэтому установите OTHER_SWIFT_FLAGS к -Xcc -Wno-error=non-modular-include-in-framework-module запретить быструю ошибку импорта.

только для тех, у кого такая же проблема

"Включение немодульного заголовка в модуль фреймворка"

Когда вы получаете эту ошибку, решением в некоторых случаях может быть просто пометить файл, который вы пытаетесь импортировать, как "общедоступный" в инспекторе файлов "Целевое членство". По умолчанию используется "Проект", и при установке таким образом это может вызвать эту ошибку. Так было и со мной, например, когда я пытался импортировать заголовки Google Analytic в каркас.

На самом деле более простой способ исправить это - переместить #import заявление к вершине .m вместо файла (вместо того, чтобы иметь его в вашем .h заголовочный файл). Таким образом, он не будет жаловаться, что он включает немодульный заголовочный файл. У меня была эта проблема где Allow non-module includes установлен в YES у меня не получилось, поэтому, переместив его в файл реализации, он перестал жаловаться. На самом деле это предпочтительный способ импорта и включения заголовочных файлов. Как только вы это сделаете, установите это обратно NO должно сработать.

В идеале мы должны попытаться Allow non-module includes установлен в NO, Установка этого в YES в большинстве случаев означает, что вы делаете что-то не так. Параметр переводится как "Разрешить импорт случайных заголовочных файлов на диск, которые не являются частью модуля". Это относится к очень немногим случаям использования на практике, и поэтому этот параметр всегда должен быть NO (т.е. значение по умолчанию).

В случае, если вы разрабатываете свой собственный фреймворк:

Почему это происходит?

Если какой-либо из общедоступных заголовочных файлов, которые вы упомянули в файле module.modulemap, содержит операторы импорта, которые не упомянуты в modulemap, это приведет к ошибке. Так как он пытается импортировать некоторый заголовок, который не объявлен как модульный (в module.modulemap), он нарушает модульность фреймворка.

КАК это исправить?

Просто включите заголовок, который дал ошибку к вашему module.modulemap и соберите снова!

ПОЧЕМУ НЕ просто установить разрешение немодульное на ДА?

Потому что это не совсем решение, с этим вы говорите своему проекту: "Этот фреймворк должен был быть модульным, но это не так. Используйте его как-нибудь, мне все равно". Это не решает проблему модульности вашей библиотеки.

Для получения дополнительной информации проверьте это сообщение в блоге или обратитесь к Clang Docs.

Если вам это нужно для целей CocoaPods, добавьте эти строки в Podfile:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      target.build_settings(config.name)['CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES'] = 'YES'
    end
  end
end

Та же проблема делает crazy.finally, я обнаружил, что вместо импорта может быть реализован "import xxx.h" в реализации вместо интерфейса. И если вы используете Cocoapods для управления вашим проектом. вы можете добавить

s.user_target_xcconfig = { 'CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES' => 'YES' }

в вашем файле 'xxx.podspec'.

Если вы видите эту ошибку в зонтичном заголовке при создании динамического фреймворка, убедитесь, что вы импортировали свой файл как:

#import "MyFile.h"

а не как #import <MyFramework/MyFile.h>,

У меня была такая же проблема, и ничто сверху не помогло мне. Поэтому я надеюсь, что мой ответ будет полезен для кого-то. В моем случае проблема была в настройке ALWAYS_SEARCH_USER_PATHS. Когда он был установлен на NO, проект строился и работал нормально. Но поскольку один из модулей требовал, чтобы он был установлен в ДА, я получал ошибку

Включение немодульного заголовка внутри модуля фреймворка

После пары чашек кофе и целого дня исследований я обнаружил, что в соответствии с известными проблемами Xcode 7.1 Beta 2 заметки о выпуске:

• Если вы получили сообщение об ошибке "Включение немодульного заголовка в модуль фреймворка" для ранее скомпилированной платформы, убедитесь, что для параметра сборки "Всегда искать пути пользователя" установлено значение "Нет". По умолчанию "Да" только по устаревшим причинам. (22784786)

Я использовал XCode 7.3, но, похоже, эта ошибка еще не исправлена.

У меня была эта ошибка в зонтичном заголовке динамического фреймворка (смесь Swift и Objective-C). Каталог общедоступных заголовков имел то же имя, что и сама структура. Переименование его в PublicHeaders помогло (заголовки все еще включены как #import <FrameworkName/Header.h>).

Мой чек-лист на этот случай:

  • набор Target Membership знак равно Public для зонтичного заголовка и всех заголовков, импортированных из него
  • набор Enable Modules (C and Objective-C) знак равно YES
  • убедитесь, что общедоступные заголовки находятся в каталоге, имя которого отличается от имени фреймворка

Я тоже столкнулся с этой проблемой и изначально думал, что это проблема CocoaPods, но это была проблема в настройках сборки приложений, где кто-то (возможно, я) установил ${PODS_ROOT} в путях поиска заголовков и установите для него recursiveпоиск. Это позволяло ему находить заголовки, которые не предназначались для использования при создании приложения. Как только я установил это для использованияnon-recursiveвсе было отлично. с помощьюrecursiveпоиск - ужасный способ найти правильные заголовки. Урок выучен.

В моем случае, поскольку каждый заголовок, который вы публикуете , виден вашим зонтичным заголовком;

Исправление заключалось в том, чтобы просто использовать только имя, например:

      #import "my-public-file.h"

Вместо:

      #import "my-path/added-to/header-search-paths/for/my-public-file.h"

Для разработчиков Flutter

flutter clean fluter pub getиpod install

решил это для меня

Это было своего рода раздражающей проблемой для меня. Похоже, никакие предложения не помогли в моем конкретном случае, поскольку мне нужно было включить "немодульные" заголовки в мой файл заголовка отдельного файла. Обходной путь, который я использовал, заключался в прикреплении вызова импорта в заголовочном файле префикса.

В моем случае я забыл добавить файлы.h и.m в раздел "s.source_files" файла.podspecs.

после добавления этого в него все работает нормально.

Пытаться @import FrameworkName вместо того #import "FrameworkName.h"

У меня была аналогичная проблема! При запуске моего целевого приложения все работало нормально, но при переходе к тестовой цели и попытке запустить тесты выскакивала ошибка "Включить немодульный заголовок внутри модуля фреймворка". Я попробовал все решения, размещенные здесь, но ни одно из них не сработало. В конце я прокрутил все настройки сборки и прочитал описание каждой из них, относящейся к заголовкам.

Переключение USE_HEADERMAP к NO сделали свое дело!

Я надеюсь, что это будет полезно для всех!

У меня возникла эта проблема, когда я добавил исходный код Swift в существующую статическую структуру ObjC (динамическая структура с типом Mach-O «Статическая библиотека»).

Исправление устанавливалось CLANG_ENABLE_MODULES ("Включить модули" в настройках сборки) на YES

Я закончил тем, что переместил Заголовок Umbrella в конец списка Заголовков после проверки вышеупомянутых решений, и это работало в Xcode 9.3.

Я решил это убрав Modules папка из рамок.

  • Перейдите к расположению вашего фреймворка, которое присутствует в проекте приложения с помощью поиска

  • Проходи внутрь Test.framework папка (в приведенном выше случае это будет CoreLibrary.framework) & Удалять Modules папка.

  • Очистите и перестройте приложение, оно решит проблему.

Мне удалось очистить десятки этих ошибок с помощью Git clean. Вот команда: git clean -dffx && git reset --hard

Другие вопросы по тегам