Теперь я хотел бы перенести мою инфраструктуру ObjC в Swift, и я получил следующую ошибку:
include of non-modular header inside framework module 'SOGraphDB'
Ссылки на файл заголовка, который просто определяет протокол, и я использую этот файл заголовка в некоторых классах, чтобы использовать этот протокол.
Похоже, это связано с функцией модуля, но на данный момент не совсем понятно, как исправить, знаете ли вы решение?
ОБНОВИТЬ:
Это ошибка компилятора Swift.
ОБНОВЛЕНИЕ 2:
Быстрое решение (но не устранение основной причины) - установить для следующего параметра значение yes: CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES
objective-c
frameworks
swift
Stephan
источник
источник
Ответы:
Ваш заголовок публичный?
Выберите файл заголовка в проводнике проекта. Затем в разделе справа в xcode вы увидите выпадающий список рядом с целью. Измените это от "проекта" до "общественности". Это сработало для меня.
источник
Это ожидаемое поведение компилятора и по очень веской причине.
Я думаю , что большинство людей , работающих в этом проблемы вызываются после того, как они переходят от
Application Target
кFramework Target
и начать добавлять C и Objective C заголовки в фреймворка заголовок зонтика ожидая его , чтобы иметь такое же поведение , как Bridging заголовок приложения , который ведет себя по- разному. Заголовок зонтика фактически предназначен для смешанной быстрой среды obj-c, и его цель - представить API-интерфейсы внешнему миру, который есть у вашей платформы в target-c или c. Это означает, что заголовки, которые мы помещаем туда, должны быть в открытом доступе.Он не должен использоваться как место, которое предоставляет заголовки Objective-C / C, которые не являются частью вашей платформы, быстрому коду вашей платформы. Потому что в этом случае эти заголовки также будут представлены внешнему миру как часть нашего каркасного модуля, что часто не то, что мы хотим сделать, поскольку это нарушает модульность. (И именно поэтому параметр « Разрешает немодульные включения в модуле фреймворка» по умолчанию равен NO )
Чтобы представить библиотеку Objective-C / C в вашем быстром коде фреймворка, мы должны определить отдельный модуль swift для такой библиотеки. Тогда
import YourLegacyLibrary
можно использовать стандартный Swift .Позвольте мне продемонстрировать это на некотором типичном сценарии: встраивание
libxml2
в нашу структуру.1. Сначала нужно создать
module.modulemap
файл, который будет выглядеть следующим образом:Для платформы OSX:
Для платформы iOS:
Все, что он делает, - это оборачивает заголовок и любые другие заголовки, на которые он ссылается, внутри модуля swift, так что swift сможет генерировать привязки swift для этих интерфейсов Си.
2. Затем в каталоге вашего проекта xcode создайте папку
SwiftLibXML2
и поместите туда этот модуль.modulemap3. В настройках сборки добавьте
$(SDKROOT)/usr/include/libxml2
в пути поиска заголовка4. В настройках сборки добавьте
$(SRCROOT)/SwiftLibXML2
в пути импорта5. В рамках проекта в Общие Вкладка, добавьте
libxml2.tbd
в Linked рамочные и библиотек .Теперь вы импортируете этот модуль, где это необходимо, с помощью:
(если вы хотите посмотреть более полный пример module.map, я бы посоветовал сослаться на модуль module.modulemap Дарвина, для его установки
/usr/include/module.modulemap
вам понадобятся инструменты командной строки Xcode, ссылка отсутствует / usr / include в OS X El Capitan )источник
module.map
устарело, его следует переименовать вmodule.modulemap
clang.llvm.org/docs/Modules.html#attributesimport SwiftLibXML2
в Objective-C? Спасибо!Вот как автоматически применить быстрое исправление, чтобы вам не приходилось менять
Pods.xcodeproj
вручную после каждогоpod install
.Добавьте этот фрагмент в конец вашего Podfile:
источник
Решением для меня было перейти на цель-> настройки сборки-> Разрешить немодульные включения в Framework Modules и переключиться на YES!
источник
Я думаю, я справился с этим. У меня есть некоторый код модели, который использует sqlite3 в рамках. В моем случае виновником был <sqlite3.h>.
Проблема заключалась в том, что в моем заголовке Module / Module.h я импортировал публичный заголовок, который импортировал <sqlite3.h>. Решением было скрыть все типы sqlite3_xxx и убедиться, что они не видны ни в одном публичном .h. Все прямые ссылки на sqlite3 были сделаны частными или видимыми для проекта. Например, у меня был публичный синглтон, на котором висели некоторые указатели sqlite3_stmt. Я переместил их в отдельный класс, который теперь является только предварительным объявлением в этом публичном заголовке. Теперь я могу строить.
Кстати, настройка CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES не работает. Я попытался установить его как в рамках, так и в зависимом проекте. Этот обходной путь был необходим, хотя я не уверен, почему.
источник
В Свифте :
1. Измените ваш проект Xcode и настройки сборки целей, как указано ниже:
Разрешить немодульные включения в каркасные модули: нет
Включить битовый код: да
2. Используйте текущую последнюю версию, доступную для GoogleMaps iOS SDK (используйте CocoaPods для ее получения):
GoogleMaps (1.10.4)
3. Прокомментируйте проблемный импорт:
4. Создайте или измените файл заголовка моста, добавив проблемный импорт:
[Ваше имя проекта XCode] -Bridging-Header.h
5. Очистите и пересоберите ваш проект XCode.
источник
Этот ответ устарел.
При импорте фреймворков вы должны импортировать все файлы заголовков, которые имеют общие зависимости с корневым заголовком. Самый простой способ убедиться, что это всегда работает, - импортировать все заголовки в папке «Заголовки» фреймворка в общий путь к заголовкам.
Компилятор Swift использует эту информацию для генерации карты не искаженных символов вместе с информацией об их связанном типе.
источник
не
Делать
источник
Заголовочный файл был выделен для цели, но помечен только как видимый проект, просто изменение общедоступного приведет к устранению этой ошибки.
источник
Я знаю, что это старый вопрос, но у меня была та же самая проблема, и ничто сверху не помогло мне. Поэтому я надеюсь, что мой ответ будет полезен для кого-то. В моем случае проблема была в настройке ALWAYS_SEARCH_USER_PATHS. Когда он был установлен на NO, проект строился и работал нормально. Но поскольку один из модулей требовал, чтобы он был установлен в ДА, я получал ошибку
После пары чашек кофе и целого дня исследований я обнаружил, что в соответствии с известными проблемами Xcode 7.1 Beta 2 заметки о выпуске :
Я использовал XCode 7.3, но, похоже, эта ошибка еще не исправлена.
источник
Переключение параметров сборки> Разрешить немодульные включения в Framework Modules в YES! решил ту же проблему для меня.
источник
Я хотел бы добавить свой опыт с этой проблемой.
Просто подведу итог:
Вот мои 2 дополнения к вышеупомянутому ответу (ответам):
<framework/headerName.h>
, а только так"headerName.h"
, проблема исчезнет.Я попробовал этот последний, и до сих пор у меня больше не возникало этой проблемы, однако я подозреваю, что это решение действительно, только если вы применили некоторые из лучших ответов (примечание: они не все совместимы, например, , модульный подход и разрешение немодульного заголовка включает).
источник
У меня была именно эта проблема при включении моей собственной структуры в проект. Исправлена ошибка, при которой все импорта sqlite3.h помещались в файлы .m, а не в публичные .h. Я предполагаю, что другие библиотеки могут отмечать аналогичные проблемы с Xcode.
источник
У меня была конкретная проблема с Facebook 4.02 SDK и FBSDKCoreKit.
Я сделал все шаги, но все еще ошибка о немодульном заголовке. я перетаскиваю только определенный заголовок из фреймворка, чтобы построить фазы-> раздел заголовка.
Затем автоматически создается копия заголовка в навигаторе проекта вверху.
Я удалил его из фаз сборки -> заголовок и удалил новый файл и работал нормально.
Как это сброшено или что-то.
источник
В моем случае (Xcode 9 бета - 6 - Swift 4 - с помощью Cocoapods) это была решена , когда я удалил Podfile.lock и Бобы каталог и побежал
pod install
сноваисточник
Я получил эту проблему после обновления проекта с swift2 на swift3. Я использовал XCode 8.3.2 для обновления кода и не смог избавиться от ошибки «немодульный заголовок внутри модуля фреймворка». Когда я открыл этот же проект в другой версии XCode (версия 9.0.1), ошибка не появилась.
источник
Чаще всего эта ошибка вызвана выбранным ответом, но у меня эта ошибка появлялась однажды случайно при перетаскивании файлов фреймворка в папку моего нового проекта. Я щелкнул, чтобы удалить рамки, но случайно нажал только «Удалить ссылку» на рамки, а не фактически полностью удалить файлы. В этот момент, если я открыл папку своего проекта в Finder, я увидел там файлы типа «CoreLocation» и «AudioToolbox». Удаление этих файлов из папки проекта и очистка проекта устранили проблему.
источник
После разрешения импорта немодульных включений вы можете попробовать импортировать этот модуль, используя заголовок Objective-C Bridging:
источник
Я решил это, удалив
Modules
папку из рамок.Перейдите к расположению вашего фреймворка, которое присутствует в проекте приложения с помощью поиска
Перейти в
Test.framework
папку (в приведенном выше случае это будетSOGraphDB.framework
) & УдалитьModules
папку.Очистите и перестройте приложение, оно решит проблему.
источник
У меня была эта проблема при импорте фреймворка Parse. Единственный способ исправить это - отменить все мои изменения, так как мой последний коммит (простое удаление фреймворка и очистка проекта не сработали) и снова добавить Parse (после новой загрузки SDK) с другими необходимыми фреймворками.
источник