Включить немодульный заголовок внутри фрейм-модуля
Я использую Xcode 6,
1) Во-первых, я создаю динамическую библиотеку (CoreLibrary). Эта библиотека содержит файл RequestPoster.h.
2) Затем я создаю Cocoa Touch Framework и добавил эту динамическую библиотеку (CoreLibrary).
- Метод sizeWithFont устарел. boundingRectWithSize возвращает неожиданное значение
- Получите данные Exif от UIImage - UIImagePickerController
- Поиск расстояния от значения RSSI устройства Bluetooth с низким энергопотреблением
- NSDictionary с упорядоченными ключами
- Как получить счетчик ссылок NSObject?
3) Затем эта структура добавляется в мой проект и дает ошибку в файле RequestPoster.h (CoreLibrary).
Ошибка: включить немодульный заголовок внутри classа модульного модуля:
ifaddrs.h, arpa / inet.h, sys / types.h>
Эти файлы не найдены в проекте.
- Плохой URL-адрес при запросе с помощью NSURL
- Есть ли iPhone SDK API для твиттера?
- objective C - Как использовать метод initWithCoder?
- Сравнение поплавковых и двойных типов данных в объекте C
- Пользовательский интерфейс UINavigationBar
- Сравните два массива с одинаковым значением, но с другим порядком
- Как преобразовать значения NSString в шестнадцатеричные значения
- Использовать метод didSelectRowAtIndexPath или prepareForSegue для UITableView?
Попытайтесь выполнить настройки сборки в разделе «objective» и установите «Разрешить немодульное включение в структурные модули» в значение «ДА».
Реальный ответ заключается в том, что местоположение импорта должно быть изменено владельцем библиотеки. Эти файлы ifaddrs.h, arpa / inet.h, sys / types.h импортируются в файл .h в фреймворке, который Xcode не нравится. Хранитель библиотеки должен переместить их в файл .m. См. Например, эту проблему в GitHub, где AFNetworking исправил ту же проблему: https://github.com/AFNetworking/AFNetworking/issues/2205
Убедитесь, что файлы заголовков общедоступны как часть общих заголовков структуры.
Goto Framework -> Target -> Build Phases и перетащите, чтобы переместить соответствующие файлы заголовков из Project в Public. Надеюсь, это поможет!
Вы можете установить Разрешить немодульное включение в Framework Modules в настройках сборки для уязвимого объекта в YES. Это настройка сборки, которую нужно изменить:
ПРИМЕЧАНИЕ . Вы должны использовать эту функцию, чтобы выявить основную ошибку, которая, как я обнаружила, часто вызвана дублированием глобального скобок с угловыми скобками, включает в себя файлы с некоторыми зависимыми отношениями, то есть:
#import // referred to in two or more dependent files
Если для параметра « Разрешить немодульное включение» в «Модулях кадра» значение « ДА» приводит к тому, что набор ошибок «Х является двусмысленной ссылкой» или что-то в этом роде, вы должны иметь возможность отслеживать дублирующие дубликаты и исключать их. После того, как вы очистили свой код, установите Allow Un-moduleular в Frame Modules обратно на NO .
У меня была такая же проблема и решить ее, просто создав заголовочный файл.
Если вы работаете над несколькими модулями в своем проекте. Тогда ваш файл заголовка должен быть общедоступным для использования в других частях проектов. Вам нужно выбрать этот заголовочный файл и в представлении «Утилиты» проекта. Измените файл с Project / Private на Public. См. Изображение ниже:
На самом деле более простой способ исправить это – переместить оператор #import
в начало .m
файла вместо него (вместо того, чтобы иметь его в файле заголовка .h
). Таким образом, он не будет жаловаться, что он включает немодульный заголовочный файл. У меня была эта проблема, когда Allow non-module includes
значение YES
, НЕ работал для меня, поэтому, переместив его в файл реализации, он прекратил жаловаться. В любом случае это предпочтительный способ импорта и включения файлов заголовков. После того, как вы это сделали, установка этого параметра на NO
должна работать.
В идеале мы должны попытаться настроить Allow non-module includes
на NO
. Установка этого значения в YES
в большинстве случаев означает, что вы делаете что-то неправильно. Параметр переводится как «Разрешить импорт случайных файлов заголовков на диск, которые не являются частью модуля». Это применимо к очень немногим практическим случаям на практике, и поэтому этот параметр всегда должен быть NO
(т. Е. Значением по умолчанию).
«Включить немодульный заголовок внутри фрейм-модуля»
Когда вы получите эту ошибку, решение в некоторых случаях может состоять в том, чтобы просто отметить файл, который вы пытаетесь импортировать как «общеansible» в инспекторе файлов «Целевое членство». По умолчанию используется «Проект», и, когда он установлен таким образом, это может привести к этой ошибке. Так было со мной при попытке импортировать заголовки Google Analytics в frameworks, например.
У меня была одна и та же проблема, и мне ничего не помогло. Поэтому я надеюсь, что мой ответ будет полезен для кого-то. В моем случае проблема была в настройке ALWAYS_SEARCH_USER_PATHS. Когда он был настроен на НЕТ, проект был построен и работал нормально. Но поскольку один из модhive требует, чтобы он был установлен в YES, я получал ошибку
Включить немодульный заголовок внутри фрейм-модуля
После пары чашек кофе и дневного исследования я узнал, что согласно известным выпускам выпусков Xcode 7.1 Beta 2 :
• Если вы получите сообщение об ошибке «Включить немодульный заголовок внутри фрейм-модуля» для ранее скомпилированной структуры, убедитесь, что для параметра «Всегда искать пользовательские пути» установлено значение «Нет». По умолчанию используется значение «Да» только по причинам, связанным с наследством. (22784786)
Я использовал XCode 7.3, но, похоже, эта ошибка еще не исправлена.
та же проблема делает crazy.finally, я нахожу, что «import xxx.h» в реализации вместо интерфейса может исправить проблему. И если вы используете Cocoapods для управления вашим проектом. вы можете добавить
s.user_target_xcconfig = {‘CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES’ => ‘YES’}
в вашем файле «xxx.podspec».
Если вам нужно это для целей 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
Если вы видите эту ошибку в заголовке зонтика при построении динамической структуры , убедитесь, что вы импортируете файл как:
#import "MyFile.h"
а не как #import
.
В случае, если вы разрабатываете свою собственную структуру:
Почему это происходит?
Если какой-либо из общедоступных файлов заголовков, упомянутых в вашем модуле.modulemap, содержит инструкции импорта, которые не упоминаются в модуле mapmap, это даст вам ошибку. Поскольку он пытается импортировать некоторый заголовок, который не объявляется модульным (в модуле.modulemap), он нарушает модульность структуры.
КАК это можно исправить?
Просто включите заголовок, который дал ошибку вашему модулю.modulemap и снова построил!
ПОЧЕМУ НЕ УСТАНАВЛИВАЕТСЯ, чтобы немодульное ДА?
Потому что на самом деле это не решение, так как вы рассказываете о своем проекте «эта структура должна была быть модульной, но это не так. Используйте ее как-то, мне все равно». Это не устраняет проблему модульности вашей библиотеки.
Для получения дополнительной информации проверьте это сообщение в блоге или обратитесь к документам clang .
Для меня это была досадная проблема. Никакие предложения, казалось, не помогли моему конкретному случаю, так как мне нужно было включить «немодульные» заголовки в отдельный файл заголовка файла. Работа вокруг, которую я использовал, заключалась в том, что она вставляла вызов импорта в файл заголовка префикса.
В итоге я переместил заголовок Umbrella в нижнюю часть списка заголовков после проверки вышеуказанных решений и работал в Xcode 9.3.
Я смог очистить десятки этих ошибок, используя Git clean. Вот команда: git clean -dffx && git reset --hard