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


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

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


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

7

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

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


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

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


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

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

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

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

Ничего себе, это единственный, который помог из этих десятков ответов, и кажется, что это будет наименее вероятным, спасибо!
— Паоло

0

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


0

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



-1

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

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


-1

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


-1

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

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

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


-2

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

Если ничего не помогает , попробуйте создать новый проект и импортировать хотя бы некоторые классы Objective 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.