Swift Framework: Заголовок парасолі '[…] .h' не знайдено


114

У призначених для користувача базах , що містять як Objective-C і Swift код, компілятор Swift видає наступне повідомлення про помилку:

[build_path]/unextended-module.modulemap:2:19: error: umbrella header 'bugtest.h' not found
  umbrella header "bugtest.h"
                  ^
<unknown>:0: error: could not build Objective-C module 'bugtest'

Відповіді:


240

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

Виправити


7
Лише зауважте майбутнім читачам, що для того, щоб побачити розділ «Заголовки» «Фази збірки», вам потрібно натиснути на ціль Pod. Основна ціль програми не відображатиме розділ "Заголовки".
шмім

3
Це повністю виправило це. Дякую. Це має бути схвалена відповідь.
Гуджамін

16
Для мене - рівень доступу був загальнодоступним, але він також не працює, коли парасолька не знайдена. Я перемістив розділ "Заголовки" розділу "Фази побудови" на початок, і він почав працювати.
Олексій Мінаєв

6
Мій заголовок парасольки вже був загальнодоступним. Переміщення розділу вгору також не допомогло.
Рафаель Бугаєвський

1
У мене виникли подібні проблеми, коли Карфаген оновив одну з моїх імпортованих рамок. Я думаю, що у XCode виникають проблеми, щоб слідкувати за змінами рамкового шляху. Простий перезапуск XCode вирішив проблему для мене.
Тоні

48

У бета-версії Xcode 7, із Swift 2, це також відбудеться, якщо ваш заголовок Framework не буде оголошено "загальнодоступним"

Наприклад, у мене з'явилася система Cocoa Touch Framework з видимістю "Project" для файлу заголовка, а помилка "Заголовок парасольки ... не знайдено" для всіх файлів Swift в моєму проекті, як тільки у мене був заголовок "Загальнодоступний", помилка пішла


1
У моєму випадку, коли я стикався з цим питанням, ця відповідь здавалася «правильнішою» відповіддю, і вона спрацювала для мене.
greymouser

1
Я погоджуюсь. Це правильна відповідь. Перевірте, чи файл <project> .h має правильне цільове членство та рівень доступу (загальнодоступний).
user965972

@ Shadow_x99 як я встановлюю заголовок як «Public», моє запитання відповідав на stackoverflow.com/questions/36084291 / ...
user2727195

Це насправді є варіантом відповіді @ arturgrigor, за винятком того, що Xcode він виконує самі зміни. Кінцевий результат повинен бути однаковим.
original_username

40

Це може статися 4 різних способів, ігноруючи помилки в попередніх версіях Xcode

  • У вашому проекті немає заголовка парасольки з назвою $ (TARGET_NAME) .h
  • У вас є заголовок парасольки, але він не встановлений як загальнодоступний. Дивіться відповідь arturgrigor
  • DEFINES_MODULE не встановлено YES
  • CLANG_ENABLE_MODULES не встановлено YES

3
П'ята причина, яку я щойно знайшов: сам umbrella_header.h не повинен перевірятися в жодній цілі (як Info.plist)
nalexn

3
У мене в цьому списку все правильно встановлено, але він не вдається.
Ерік Егнер

25

Це станеться, коли Always Search User Pathsналаштування буде включено для цілі Framework.

Якщо встановити його, ви Noзможете усунути цю помилку.

ІМХО, це помилка у компіляторі Swift, і я подав радіолокатор в Apple.
Див. Rdar: // 21038443


1
Дякую! Це те, що мене і отримало.
Кріс Хаттон

Це працювало для мене. Додатковим симптомом є те, що він вийшов з ладу відразу після очищення, але досяг успіху, якщо ви повторно спробували без очищення.
Ben Leggiero

18

Для мене - рівень доступу був загальнодоступним, але він також не працює, коли парасолька не знайдена. Я перемістив розділ "Заголовки" розділу "Фази побудови" на початок, і він почав працювати. Сценарій до підфілів:

post_install do |installer|
installer.pods_project.targets.each do |target|
    phase_name = 'Headers'
    target.build_phases.each do |phase|
        if (phase.display_name.include? phase_name)
            target.build_phases.unshift(phase).uniq! unless target.build_phases.first == phase
        end
    end
end

Не майте поняття, чому це відбувається. Пробували на манекенських проектах - не буває. Тільки на великих із множинними залежностями. Щось із компілюванням ПЕРЕД копіюванням заголовків парасольки.


4
Переміщення "заголовків" над "Збір джерел" працювало на мене. xCode 8.2.1.
Роб Патерсон

Переміщення фази заголовків до вершини також працювало для мене.
Søren Mortensen

Недійсний Podfileфайл: помилка синтаксису, несподіваний кінець вводу, очікуючи ключового слова_end.
Володимир Кулик

13

Ви, безумовно, повинні встановити рамки для всіх:

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


1
Працює чудово. Дуже дякую!
kkiermasz

Який контекст цього скріншоту? Що ти клацаєш, щоб потрапити туди?
пкамб

7

Для мене налаштування "Використовувати Карти заголовка" на "НІ" вирішило проблему


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

7

Ще одне рішення: Після перейменування папки старе місце розташування все ще може бути вказане у файлі проекту для .h-файлу, навіть якщо ви оновили місцезнаходження за допомогою бічної панелі Xcode. Це старе місце розташування викликає помилку заголовка парасольки.

Просте рішення: Видаліть посилання на файл .h та повторно додайте. (а потім не забудьте опублікувати його знову!)


5

Я виявив, що при включенні системи New Swift Build і Parallelize Build за схемою я отримаю помилки, як у цьому питанні. Рішення полягало в тому, щоб пов’язати рамки, імпортовані у швидкі вихідні файли. (Я думаю, що раніше додаток будуватиметься, тому що просто трапилось, що рамки були пов’язані з чимось побудованим раніше в черзі послідовного збирання).

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

https://github.com/Jon889/SwiftImportChecker


4

Тут вже є чудові відповіді. @ Shadow_x99's був дуже корисним. Однак якщо мені можна дозволити доповнити власний досвід.

Заголовок парасольки ідентифікується автоматично в процесі збирання. Він не вказаний у налаштуваннях збирання цілі або успадкований від налаштувань проекту.

Отже, щоб уникнути цієї помилки, що - як і XCode 7 - полягає в наступному;

warning: no umbrella header found for target 'MyTarget', module map will not be generated

необхідно зробити два важливі кроки.

По-перше, заголовок парасольки повинен мати те саме ім’я, що і ціль . Отже, якщо ваша мета - це ім'я рамки MyTarget, має бути назва заголовка MyTarget.h.

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


1

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

Я додав "Запуск сценарію" в "Фази збірки", але в кінцевому підсумку видалив його, і тоді я почав отримувати помилку.

Моє рішення закінчилося необхідністю очистити проект, відновити мою основу, а потім мій проект програми побудований правильно.


1

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


0

Якщо ви використовуєте Xcode 7.1 та CocoaPods 0.39, можливо, швидка зміна компілятора, яка впливає на деякі CocoaPods (Nimble, Quick тощо). Спробуйте деякі рішення, вказані в цій темі: https://github.com/ CocoaPods / CocoaPods / issues / 4420, однак, якщо жоден з них не працює, спробуйте використовувати Xcode 7.0.1 або 7.2 beta. Ви можете їх отримати тут: https://developer.apple.com/downloads/ .

Редагувати: У моєму випадку, щоб вирішити проблему, мені довелося також зменшити показник CocoaPods до 0,38,2.

Пізніше редагування: Здається, це не пов’язано з Xcode 7.1. Просто пониження рівня CocoaPods до 0,38,2 повинно допомогти:

sudo gem uninstall cocoapods -v 0.39
sudo gem install cocoapods -v 0.38.2

Дякуємо @Marius Ursache Виконуючи ваші вказівки, вирішили проблему для мене.
Віка Свіфт

0

Файл заголовка повинен знаходитись у розділі [Фази збірки / заголовки / загальнодоступні].

Якщо ваш заголовочний файл уже знаходиться у розділі [Фази збірки / заголовки / загальнодоступні], багато разів це робило наступні проблеми:

  1. очистити проект
  2. перемістіть файл заголовка до розділу "приватний" або "проект"
  3. поверніть файл заголовка назад до розділу "загальнодоступний"
  4. відновити все заново

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

0

Я вирішив це, перейменувавши мою module.modulemap на moduleXYZ.modulemap та змінивши ім'я файлу modulemap у налаштуваннях проекту


0

У моєму випадку я просто побудував конкретні рамки зі своєю схемою. А потім відновити весь проект, і це вирішило питання


0

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


-1

Видаліть ці файли з каталогу проекту. .xcworkspace pods/іpodfile.lock

оновити стручок і скласти проект.


-1

Я виправив це, зробивши в режимі компіляції налаштування проблемної рамки збільшити на Incremental.


-1

У моєму випадку проблема була викликана видаленням заголовків заголовка у Build Build Phases

function removeHeaders() {  
    find $BUILD_ROOT/...  -name '*.h' -exec rm -f {} \;  
}  
removeHeaders

Видалення цього сценарію виправило проблему.


-2

Жоден із 9 відповідей мені не допоміг, тому я спробував створити новий проект, який я міг би надіслати Apple, щоб подати помилку. Я був здивований, що не зміг відтворити проблему. Я перевірив налаштування збірки, і вони були еквівалентними. Мабуть, це якась помилка.

Якщо нічого іншого не допомагає , спробуйте створити новий проект та імпортувати принаймні деякі об'єктивні C & Swift класики з вашого поточного проекту, порівняйте налаштування, пов’язані з рамками, зі значеннями за замовчуванням у новому проекті та врешті перемістіть усі файли на новий проект.


-2

Я працюю над цим цілий день, але воно того варте. Я спробував усі шляхи тут, але не вирішив. Я створив новий проект, експеримент, і я виявив, що Шлях пошуку в заголовку користувача був встановлений $ {SRCROOT} рекурсивним , і я змінив його на $ {SRCROOT} на нерекурсивний , змінив мостовий шлях заголовка (наприклад #import "SVProgressHUD.h" -> #import "Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.h"), помилка пішла.

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