Swift Framework: Umbrella header '[…] .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

Обычно это происходит после переименования проекта или чего-то подобного. Проблема в том, что зонтичный заголовок больше не указан как общедоступный . Проверьте прикрепленное изображение, чтобы узнать, как это исправить.

Fix

arturgrigor
источник
7
Просто примечание для будущих читателей: чтобы увидеть раздел «Заголовки» в «Фазах сборки», вам нужно щелкнуть по цели Pod. Основная цель приложения не будет содержать раздел «Заголовки».
shmim
3
Это полностью исправило это. Спасибо. Это должен быть утвержденный ответ.
Гуджамин
16
Для меня уровень доступа был общедоступным, но он также не работает на зонтике, который не найден. Я переместил раздел «Заголовки» в «Фазы сборки» наверх, и он начал работать.
Алексей Минаев
6
Заголовок моего зонтика уже был публичным. Перемещение раздела вверх тоже не помогло.
Рафаэль Бугаевский,
1
У меня была аналогичная проблема, когда Карфаген обновил одну из моих импортированных фреймворков. Я предполагаю, что у XCode есть проблемы с отслеживанием изменений пути, на которые ссылаются. Простой перезапуск XCode устранил проблему для меня.
Тони
48

В Xcode 7 Beta со Swift 2 это также произойдет, если ваш заголовок Framework не объявлен как «Public»

Например, у меня была Cocoa Touch Framework с видимостью «Project» для файла заголовка и с ошибкой «Umbrella Header ... not found» для всех файлов Swift в моем проекте, как только у меня был заголовок «Public», ошибка исчезла

Клод Уль
источник
1
В моем случае, когда я столкнулся с этой проблемой, этот ответ казался «более правильным», и он сработал для меня.
greymouser
1
Я согласен. Это правильный ответ. Убедитесь, что файл <project> .h имеет правильное целевое членство и уровень доступа (открытый).
user965972
@ Shadow_x99, как мне установить заголовок как «Открытый», мой вопрос размещен на stackoverflow.com/questions/36084291/…
user2727195
На самом деле это вариант ответа @arturgrigor, за исключением того, что Xcode сам выполняет изменение. Конечный результат должен быть таким же.
original_username
40

Это может произойти 4 различными способами, игнорируя ошибки в предыдущих версиях Xcode.

  • В вашем проекте нет зонтичного заголовка с именем $ (TARGET_NAME) .h
  • У вас есть заголовок зонтика, но он не установлен как общедоступный. См. Ответ артургригора
  • DEFINES_MODULE не установлен на YES
  • CLANG_ENABLE_MODULES не установлен на YES
Клаус Йоргенсен
источник
3
Пятая причина, которую я только что обнаружил: сам
зонтик_header.h
3
У меня все в этом списке настроено правильно, но это не удается.
Эрик Айгнер
25

Это произойдет, когда Always Search User Pathsпараметр включен для цели Framework.

Установка этого значения Noустранит эту ошибку.

IMHO, это ошибка в Swift Compiler, и я отправил радар в 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.
Роб Патерсон
У меня тоже сработало перемещение фазы заголовков наверх.
Сорен Мортенсен
Недействительный Podfileфайл: синтаксическая ошибка, неожиданный конец ввода, ожидается keyword_end.
Владимир Кулик
13

Определенно вы должны сделать свою структуру общедоступной:

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

Бартломей Семанчик
источник
1
Прекрасно работает. Большое спасибо!
kkiermasz
Каков контекст этого скриншота? Что вы нажимаете, чтобы попасть туда?
pkamb
7

Для меня установка "Использовать карты заголовков" на "НЕТ" решила проблему.

xySVerma
источник
… И в моем случае установка значения «ДА» устранила проблему. К сожалению, по этому параметру, похоже, нет документации, но по умолчанию установлено «да», и я не уверен, почему для одной из моих целей было установлено значение «нет».
robotspacer 01
7

Еще одно решение: после переименования папки старое местоположение все еще может быть указано в файле проекта для файла .h, даже если вы обновили местоположение через боковую панель Xcode. Это старое расположение вызывает ошибку заголовка зонтика.

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

Danra
источник
5

Я обнаружил, что при включенной схеме New Swift Build System и Parallelize Build я получаю ошибки, подобные этому вопросу. Решением было связать фреймворки, которые были импортированы в исходные файлы swift. (Я думаю, что раньше приложение создавалось, потому что так случилось, что фреймворки были связаны с чем-то, созданным ранее в очереди последовательной сборки).

Я написал сценарий, чтобы выполнить весь импорт во всех целевых объектах в рабочей области и убедиться, что их фреймворки связаны с этой целью.

https://github.com/Jon889/SwiftImportChecker

Джонатан.
источник
4

Здесь уже есть отличные ответы. @ Shadow_x99 был очень полезен. Однако, если бы мне было позволено дополнить его своим собственным опытом.

Заголовок зонтика определяется автоматически в процессе сборки. Он не указан в настройках целевой сборки и не унаследован от настроек проекта.

Итак, чтобы избежать этой ошибки, которая - по состоянию на XCode 7 - выглядит следующим образом:

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

Необходимо сделать два важных шага.

Во-первых, заголовок зонтика должен иметь то же имя, что и цель . Поэтому, если ваша цель - это платформа с именем MyTarget, должен быть заголовок с именем MyTarget.h.

Во-вторых, на этапах сборки MyTarget- как указано в этом ответе - этот файл заголовка должен быть указан в общедоступном разделе, как описано выше.

Макс Маклауд
источник
1

У меня была такая же проблема, и ни один из предложенных ответов не помог в моем случае, поэтому я оставляю это здесь, если у кого-то такая же проблема.

Я добавил «Выполнить сценарий» в «Фазы сборки», но в итоге удалил его, и именно тогда я начал получать ошибку.

Мое решение закончилось тем, что мне пришлось очистить проект, перестроить мою структуру, а затем мой проект приложения был построен правильно.

Ана Фигейра
источник
1

По моему опыту, вы должны выбирать в качестве целей фреймворк, который выдает ошибку, а не цель проекта.
Затем скомпилируйте, и после компиляции он будет доступен для цели проекта.

Eironeia
источник
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
источник
Спасибо @Marius Ursache. Следуя вашим инструкциям, я решил проблему.
Вик Свифт,
0

Ваш заголовочный файл должен находиться в разделе [Build Phases / Headers / Public].

Если ваш файл заголовка уже находится в разделе [Build Phases / Headers / Public], много раз выполнение следующих действий решило мою проблему:

  1. очистить проект
  2. переместите файл заголовка в раздел "частный" или "проект"
  3. переместите файл заголовка обратно в "публичный" раздел
  4. перестроить все заново
Андрей А.
источник
Ничего себе, это единственный, который помог из этих десятков ответов, и кажется, что это будет наименее вероятным, спасибо!
Паоло
0

Я решил это, переименовав свой module.modulemap в moduleXYZ.modulemap и изменив имя файла modulemap в настройках проекта.

retterdesapok
источник
0

В моем случае я просто построил конкретный фреймворк с его схемой. А затем перестройте весь проект, и проблема решена.

Худи Ильфельд
источник
0

убедитесь, что "пути импорта" в настройках сборки включают файл, который вы пытаетесь включить ...

Маленький сторож
источник
-1

Удалите эти файлы из каталога проекта. .xcworkspace pods/иpodfile.lock

обновите модуль и соберите проект.

Subhash
источник
-1

Я исправил это, установив режим компиляции проблемных настроек сборки фреймворка на инкрементный.

Гислен Леблан
источник
-1

В моем случае проблема была вызвана скриптом удаления заголовков на этапах сборки.

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

Удаление этого скрипта устранило проблему.

phnmnn
источник
-2

Ни один из 9 ответов мне не помог, поэтому я попытался создать новый проект, который можно было бы отправить в Apple, чтобы сообщить об ошибке. Я был удивлен, что не смог воспроизвести проблему. Я проверил настройки сборки, они были эквивалентны. Видимо это какой-то баг.

Если ничего не помогает , попробуйте создать новый проект и импортировать хотя бы некоторые классы Objective C и Swift из текущего проекта, сравните параметры сборки, связанные с вашей платформой, со значениями по умолчанию из нового проекта и, в конечном итоге, переместите все файлы в папку новый проект.

Рафаэль Бугаевский
источник
-2

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

ShengBo.Cai
источник