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


143

Я використовую Xcode 6,

1) По-перше, я створюю динамічну бібліотеку (CoreLibrary). Ця бібліотека містить файл RequestPoster.h.

2) Потім я створив Cocoa Touch Framework і додав цю динамічну бібліотеку (CoreLibrary).

3) Потім цей фреймворк додається до мого проекту, і він дає помилку у файлі RequestPoster.h (CoreLibrary).

Помилка: включення немодульного заголовка до класу рамкового модуля:

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

Цей файл не знайдено в проекті.

Відповіді:


190

Спробуйте перейти до "Налаштування параметрів" у розділі "Ціль" та встановіть "ТАК".

Справжня відповідь полягає в тому, що власник бібліотеки повинен змінити місце імпорту. Ці файли ifaddrs.h, arpa / inet.h, sys / types.h імпортуються у .h-файл у рамках, який Xcode не любить. Підтримувач бібліотеки повинен перемістити їх у файл .m. Дивіться, наприклад, цю проблему на GitHub, де AFNetworking вирішив ту саму проблему: https://github.com/AFNetworking/AFNetworking/isissue/2205


2
У разі, якщо в заголовку з помилкою використовується тип із імпортованих заголовків, що рекомендується? Наприклад, якщо заголовок module.h в модулі оголошує функцію, що приймає параметр типу ifaddrs, вони зобов'язані імпортувати ifaddrs.h.
Айуш Гоел

Але що робити, якщо вони включають, як-от /usr/include/libproc.h?
Бен Леджієро

3
Чи не могли б ви пояснити , що таке вплив зміни: Дозволити немодульность Включає в Framework модулі
NR5

Я думаю, що, мабуть, найкраща відповідь - це зробити його модульним заголовком, а не заглушити цю помилку. Я легко уявляю, як Apple видалила опцію, щоб дозволити немодульні заголовки в модулі.
Бен Леджіеро

170

Переконайтесь, що файли заголовків є загальнодоступними як частина загальнодоступних заголовків рамки.

Goto Framework -> Target -> Phases Build і перетягніть для переміщення відповідних файлів заголовків з Project у загальнодоступні. Сподіваюся, що це допомагає!

Знімок екрана


3
Це допомогло мені включити об'єктивний код C у рамку Swift, дякую!
Вадим

1
Ви також можете змінити цільове членство від Project to Public у вашому файлі, скориставшись вікном File Inspector праворуч від головного екрану XCode.
Кормиця

Якщо ви імпортуєте бібліотеку в суміш швидкого / objc, потрібно також забезпечити, що мостовий заголовок є загальнодоступним. Помилку я зробив!
Нік H247

74

Ви можете встановити " Дозволити немодульні включення" в "Модулі рамки" в "Налаштуваннях збірки" для ураженої цілі "ТАК". Це налаштування збірки, яке потрібно змінити:

Елемент "Налаштування збірки", який потрібно відредагувати

ПРИМІТКА . Ви повинні використовувати цю функцію для виявлення основної помилки, яку, як я виявив, часто викликана дублюванням кутового глобального коду, що включає файли з певним залежним співвідношенням, тобто:

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

Якщо параметр Дозволити немодульность включає в рамках модулів для YES результатів в наборі «X неоднозначною посилань» помилка або що - то в цьому роді, ви повинні бути в змозі відстежити ображаючи дублікат (и) і усунути їх. Після того, як ви очистили свій код, встановіть для параметра « Дозволити немодульні» включити в модулі кадру назад значення « НІ» .


1
Гаразд, саме кутові дужки викликали проблему! У мене виникла ця проблема з імпортом CocoaPods і виправлено її, змінивши імпорт, щоб використовувати лапки замість кутових дужок.
Майкл Форест

На жаль, ні. Виявлено, що його зламали після того, як я очистив свій проект: - /
Майкл Форест

2
Я не можу знайти жодних «неоднозначних посилань» попереджень. Які недоліки залишити його набір в YES ?
Nicolas Miari

28

У мене була така ж проблема і вирішити її, просто оприлюднивши файл заголовка. [проблема]

Якщо ви працюєте над декількома модулями у своєму проекті. Тоді файл заголовка повинен бути загальнодоступним, щоб використовувати його в інших частинах проектів. Вам потрібно вибрати цей файл заголовка та у вікні утиліти проекту. Змініть файл з Project / Private на Public. Дивіться зображення нижче:

Зміна області заголовка файлу


Зокрема, це відбувається при дублюванні існуючого загальнодоступного заголовка, дублюване членство заголовка змінюється на "проект"
Jeremie

ні, це не є обов'язковим для дублювання речі. Це може статися через різні випадки, наприклад, якщо ви імпортуєте якийсь проект як бібліотеку у свій проект, а потім намагаєтесь змінити приватні класи. Ви знаєте файл заголовка і пишете його, але доступ не є загальнодоступним для всіх проектів.
Саад

23

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

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


Ця відповідь мені дуже допомогла в моїй подібній проблемі. Я не знав, що файли заголовків рам можуть бути додані до цілі. У прикладних проектах заголовки ніколи не є частиною цілі.
біо

20

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

В ідеалі ми повинні намагатися і прагнути бути Allow non-module includesвстановлені NO. Якщо встановити це YESв більшості випадків, це означає, що ви робите щось не так. Цей параметр означає "Дозволити імпорт випадкових файлів заголовків на диск, які інакше не є частиною модуля". Це стосується дуже мало випадків використання на практиці, і тому ця настройка завжди повинна бути NO(тобто значення за замовчуванням).


10

Якщо ви розробляєте власні рамки:

ЧОМУ це відбувається?

Якщо у будь-якому з загальнодоступних файлів заголовків, які ви згадали у вашому module.modulemap, є заяви про імпорт, які не згадуються в mapmap, це призведе до помилки. Оскільки він намагається імпортувати деякий заголовок, який не оголошено модульним (у module.modulemap), він порушує модульність рамки.

ЯК я можу це виправити?

Просто включіть заголовок, який дав помилку вашому module.modulemap, і створити знову!

ЧОМУ НЕ просто встановити дозволяють НЕ модульно ТАК?

Тому що це насправді не рішення, з тим, що ви кажете своєму проекту, "ця рамка повинна була бути модульною, але це не так. Використовуйте її якось, мені все одно". Це не вирішує проблему модульності вашої бібліотеки.

Для отримання додаткової інформації відвідайте цей пост в блозі або зверніться до брязкоту документації .


як ви налаштували його module.modulemap за допомогою какао-проектів, я намагався дозволити моїй бібліотеці працювати з проектами, що стосуються лише Swift, але оскільки одна залежність бібліотеки, module.modulemap не працює, cocoapod є автогенерування картки модулів, але, здається, це не працює, чи стикалися ви з чимось подібним?
Amadeu Cavalcante Filho

8

Якщо вам це потрібно для цілей 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

7

Allow Non-modular Includes in Framework Modulesпрацювати тільки в коді objc. не швидко працювати.

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

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


6

У мене було те саме питання, і нічого зверху мені не допомогло. Тож сподіваюся, що моя відповідь комусь буде корисною. У моєму випадку проблема була в налаштуваннях ALWAYS_SEARCH_USER_PATHS. Коли було встановлено НІ проект, побудований і працював нормально. Але наскільки один із стручків вимагав, щоб його було встановлено ТАК, я отримував помилку

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

Після декількох чашок кави та цілодобових досліджень я з’ясував, що згідно з відомими питаннями Xcode 7.1 Beta 2 відзначає :

• Якщо ви отримаєте помилку із зазначенням "Включити немодульний заголовок всередині модуля рамки" для рамки, яка раніше була скомпільована, переконайтесь, що для налаштування "Завжди шукати шляхи користувача" встановлено значення "Ні". За замовчуванням є "Так" лише зі застарілих причин. (22784786)

Хоча я використовував XCode 7.3, але, здається, ця помилка ще не виправлена.


6

така ж проблема робить crazy.finally, я вважаю, що поставити 'import xxx.h' в реалізацію замість інтерфейсу можна виправити проблему. І якщо ви використовуєте Cocoapods для управління вашим проектом. Ви можете додати

s.user_target_xcconfig = {'CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES' => 'ТАК}}

у вашому файлі "xxx.podspec".


6

Якщо ви бачите цю помилку в заголовку парасольки під час створення динамічного фрейму , переконайтесь, що ви імпортуєте файл у такий спосіб:

#import "MyFile.h"

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


2

Я також натрапив на цю проблему і спочатку подумав, що це проблема CocoaPods, але це була проблема в налаштуваннях побудови додатків, де хтось (напевно, я) встановив ${PODS_ROOT}Шляхи пошуку заголовків і встановив його як recursiveпошук. Це дозволило їй знайти заголовки, які не планували використовувати під час створення програми. Одного разу я встановив це для використання, non-recursiveвсе було добре. використання recursiveпошуку - це жахливий хак, щоб спробувати знайти належні заголовки. Заняття.


Я можу підтвердити, що це була і моя проблема.
Вілсон

У мене була ця проблема з персоналізованимAdConsent і це виправлено. Дякую!
Стівен Елліотт

1

Це було для мене дратівливим питанням. Ніякі пропозиції не допомагають моєму конкретному випадку, оскільки мені потрібно було включити "немодульні" заголовки до мого окремого файлу заголовка. Робота, яку я використав, була закріпленням імпортного виклику у файлі заголовка префікса.


0

Після перевірки вищезазначених рішень я перемістив заголовок парасольки до нижнього списку заголовків, який працював у Xcode 9.3.


0

Я вирішив видалення Modulesпапки з фреймворку.

  • Перейдіть до свого базового місця, яке присутнє в програмі додатків, за допомогою пошуку

  • Перейдіть всередину Test.frameworkпапки (у наведеному вище випадку це буде CoreLibrary.framework) та видалити Modulesпапку.

  • Очистіть і перетворіть додаток, воно вирішить проблему.


0

У моєму випадку я забув додати .h та .m файл у розділ "s.source_files" файлу .podspecs.

після додавання цього в нього добре працює.

введіть тут опис зображення



-5

Я зміг очистити десятки цих помилок за допомогою Git clean. Ось така команда: git clean -dffx && git reset --hard

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.