Включение немодульного заголовка внутри модуля фреймворка
Я использую 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