Получение сообщения «файл не найден» в заголовке моста при импорте фреймворков Objective-C в проект Swift


96

У меня есть проект Swift, для которого я пытаюсь импортировать фреймворки на основе ObjC. Фреймворк находится в каталоге по пути к проекту и на него ссылается проект в Xcode. Он также добавлен в раздел «Связать двоичный файл с библиотеками» на странице проекта «Фазы сборки».

Однако по какой-то причине я не могу включить фреймворк в файл Bridging-Header. Я получаю следующую ошибку:

BridgingHeader.h:5:9: error: 'Parse/Parse.h' file not found
#import <Parse/Parse.h>
        ^
<unknown>:0: error: failed to import bridging header 'BridgingHeader.h'

Что я проверил:

  1. «Заголовок совместимости Install Objective-C» установлен на «YES».
  2. Пути поиска заголовков включают путь к фреймворкам.

Я уверен, что что-то упустил, так что, если у кого-то есть какие-то подсказки, было бы здорово.


3
Я забыл Header Search Paths
указать

Ответы:


78

Нашел решение:

  • Параметр «Objective-C Bridging Header» (он же SWIFT_OBJC_BRIDGING_HEADER) должен быть установлен на целевом уровне, а НЕ на уровне проекта. Обязательно удалите значение настройки на уровне проекта.

(мне это кажется ошибкой Xcode, так как я не знаю, почему он ее исправляет).


1
Это действительно странно, у меня была такая же ошибка, и оказалось, что у меня был заголовок, определенный на уровне проекта. Несмотря на то, что я уже определил его на уровне Target, мне пришлось удалить его с уровня Project, чтобы можно было добавлять сторонние Framework. Вызывающе кажется, что это ошибка Xcode.
Jojodmo

2
@MarcoAlmeida, если у вас есть цель для тестов, попробуйте удалить и из нее параметр "Objective-C Bridging Header". Это должно помочь.
Давлат Мирманов

3
Невероятно. Спасибо.
Даррен

1
Привет всем! Есть такая же проблема здесь :( Хотя она не решается описанным выше методом ...
Майк К.

1
Это сработало для меня в Xcode 9.2. Все еще не исправлено после стольких лет ...
Оливер Эйххорн

58

У меня такая же проблема. Например, я изменил весь свой импорт с #import "HMSegmentedControl.h"на #import <HMSegmentedControl/HMSegmentedControl.h>.


7
Для работы с коконодами это необходимо. В заголовке Bridging никогда не импортируйте модуль как #import "abc.h" пользователь #import <abc / abc.h> Не нравится.
NaXir

1
Ты бог! Большое спасибо за это.
Alper

В моем случае я преобразовал #import <ios-qr-encoder / UIImage + MDQRCode.h> в #import «UIImage + MDQRCode.h», и это сработало
Машхади

Ты король
Итаи Спектор

27

Мне пришлось добавить свой libкаталог в Пути поиска заголовков пользователей:

настройки тестовой цели - путь поиска заголовка пользователя

В моем случае libкаталог содержит .aфайл -library и несколько файлов заголовков. Они включены в файл заголовка моста. Однако быстрый компилятор их не нашел. Только когда я добавил ${PROJECT_DIR}/libв путь поиска заголовка пользователя, он создал тестовую цель.

(Я использую Xcode 6.2 на Mavericks 10.9.5)


1
Я мог бы решить эту проблему, добавив Pods / * в пути поиска заголовков основной цели. Интересно, что у меня не было этой проблемы до добавления фреймворков Swift в качестве зависимостей для моей цели. Xcode 7 beta 6.
bizz84

Именно это сработало для меня. У меня есть фреймворк, включенный в мой проект, который содержит библиотеку (.a). Мне пришлось создать путь поиска к заголовкам библиотеки в Пути поиска заголовков пользователя.
Chris Livdahl

Также пришлось импортировать папку Pods / library, большое спасибо!
thibaut noah

17

Мы столкнулись с тем же сообщением об ошибке, но с совершенно другой причиной.

Настроить:

  • Цель приложения, весь код Obj-C
  • Целевой объект Unit Test с одним быстрым тестом и заголовком моста, относящимся к коду приложения

Когда мы добавили второй быстрый тестовый пример после очистки (или на машине товарища по команде), мы увидели эту ошибку при построении цели модульного теста.

Это было исправлено путем добавления фиктивного класса Obj-C к цели модульного теста.


5
Спасибо. Это абсолютно сработало, хотя в этом нет никакого смысла.

Впоследствии я смог удалить фиктивный класс Obj-C. Я предполагаю, что побочным эффектом этого решения является создание заголовка моста, специфичного для тестовой цели, который, в свою очередь (я подозреваю), заставляет Xcode игнорировать заголовок моста хост-приложения.
clozach

Дополнение к вышесказанному: после выполнения чистой сборки я начал получать ошибку сегментации 11 во время компиляции. После некоторых проб и ошибок выяснилось, что фиктивный файл .m должен присутствовать, но он может быть пустым. Безумие.
Clozach

Добавление фиктивного класса objc к моей тестовой цели исправлено для меня!
neoneye

5

Если вы используете cocoapods, попробуйте переустановить модули, выполнив следующую команду.

pod install

Это помогло мне, поскольку я недавно создал новую конфигурацию, которая не компилировалась (проблема с тем же файлом не найдена), в то время как другие конфигурации (отладка и выпуск) были. pod installкажется, требуется для добавления любых новых конфигураций ...
Mete

5

Это как-то помогло мне:

  • Чистый проект
  • Папка чистой сборки
  • Перезапустить Xcode

Приходите с общими ответами, а не хитростями.
Нико

Этот конкретный трюк требует гораздо меньше усилий, поэтому не повредит попробовать, пока вы думаете о других решениях. ;)
Hlung

1
К сожалению, именно этот хитрый трюк слишком часто оказывается правильным ответом.
Роберт Шмид

5

Эта ошибка появилась при установке с Cocoapods библиотеки CocoaImageHashing. Проблема заключалась в том, что пути поиска были неправильными. Таким образом, на целевом уровне в настройках сборки -> Пути поиска -> Пути поиска заголовков, пути соответствовали несуществующим папкам, например "$ {PODS_ROOT} / Headers / Public / CocoaImageHashing", когда структура папок Headers / Public / не существует. Я добавил путь $ {PODS_ROOT} / CocoaImageHashing и ошибка исчезла.


4

Что ж, это немного странно, но я думаю, вам нужно добавить ресурс на фазу «Копировать ресурсы пакета» вашей тестовой цели, чтобы он загружал все заголовки из вашего основного целевого приложения. В моем случае я добавил, main.storyboardи он позаботился об ошибке.

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


4

Это случилось со мной после добавления / переименования текущих конфигураций, и это имеет смысл.

Каждая конфигурация использует набор конфигураций, созданный cocoapods, поэтому эти вещи должны совпадать.

Поэтому, если вы добавляете / переименовываете конфигурации, они должны будут использовать правильные наборы конфигурации, и для этого запуск pod installбудет делать это.


3

Если кому-то поможет.

В моем случае мои файлы obj-c были добавлены в справочную папку (синие папки в xcode), и заголовок не смог их найти. Просто добавил файлы, а не папку из искателя в xcode и решил.


2

У меня такая же проблема. Для меня причина заключалась в том, что я использовал один и тот же заголовок-мост как для моего приложения, так и для моего сегодняшнего расширения. My Today Extension не включает синтаксический анализ, но поскольку он был определен в заголовке моста, он пытался его найти. Я создал новый мостовой заголовок для своего расширения Today Extension, и ошибка исчезла.


Не похоже на ту же проблему, что и у меня. У меня нет расширения "Сегодня". В моем случае я использую заголовок моста для приложения, а структура Parse включена в зависимости приложения. Ошибка также возникает для других фреймворков, а не только для Parse.
Диа Харрат

2

Моя структура работала раньше и внезапно перестала работать, и ни один из этих ответов не работал у меня. Я удалил фреймворк в Build Phases> Link Binary With Libraries и снова добавил его. Снова заработал.


2

У меня была проблема, и я решил ее, потратив 2 часа на поиск. Моя среда, как показано ниже:

коконожа 0,39,0

быстрый 2.x

XCode 7.3.1

Шаги:

  1. путь к проекту: имя_проекта / имя_проекта / your_bridging_header.h
  2. В разделе Swift в настройках сборки заголовок моста Objective-C должен быть: имя_проекта / your_bridging_header.h
  3. В your_bridging_header.h измените все объявления с .h на #import
  4. В классе, который используется your_3rd_party . Declare импорт your_3rd_party

Ваш ответ правильный, просто добавьте ответ @jamesthakid в третьем пункте, чтобы было более понятно. У меня сработало спасибо.
NaXir

5
Что именно вы имеете в виду, говоря «изменить все объявления с .h на #import»?
Крис Гунавардена

1

Я только что продублировал существующую схему и добавил в проект другую конфигурацию. Мне пришлось добавить конфигурацию с тем же именем в проект фреймворка, чтобы он также располагался в той же DerivedData/($AppName)/Build/Products/($CONFIGURATION_NAME)папке. В противном случае файл .framework не будет создан и, следовательно, не может быть импортирован.


1

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

В подфиле я use_frameworks!написал. Комментируя эту строку, а затем pod installснова запустив ее, я решил эту проблему, и ошибка исчезла.


1

(Обновлено 27 мая 2017 г.)

Xcode 8. Swift Project - импорт Objective C.

Что нужно знать:

  1. Файл заголовка моста ДОЛЖЕН быть сохранен в папке проекта. (т.е. не сохраняется на том же уровне, что и .xcodeproj, а вместо этого на один уровень ниже в папки, где сохраняются все ваши быстрые и объективные файлы c). Он все еще может найти файл на верхнем уровне, но он не будет правильно связывать и не сможет импортировать файлы Objective C в файл заголовка моста.
  2. Заголовочный файл моста может называться как угодно, если это заголовочный файл .h
  3. Убедитесь, что путь в разделе «Параметры сборки»> «Компилятор Swift - Общие»> «Заголовок моста для цели C» правильно указывает на созданный вами файл заголовка моста.
  4. ВАЖНО: если вы по-прежнему получаете сообщение «не найден», попробуйте сначала очистить файл заголовка моста и стереть все импортированные данные, которые вы в данный момент там написали. Убедитесь, что сначала можно найти файл заголовка моста, а затем начните добавлять в этот файл импорт объекта c. По какой-то причине он вернет ту же ошибку «не найден», даже если она будет обнаружена, но ему не нравится импорт, который вы пытаетесь по какой-то причине
  5. Вы не должны # импортировать "MyBridgingHeaderFile.h" ни в один из ваших целевых файлов C. Это также вызовет ошибку «файл не найден».

1
Все эти пункты проверены, и по-прежнему возникают те же проблемы :( Какие-либо дополнительные моменты следует принять во внимание?
Амджад Хусейни

@AmjadHusseini попробуйте очистить файлы вашего проекта, затем очистите производные данные вашего проекта, а затем перезапустите xCode. это сработало со мной
Мохаммад Аллам

0

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

Когда я копировал библиотеку (перетаскивая) в проект, без Cocoapods, только после этого я мог импортировать заголовки без ошибок.

Я использовал библиотеку facebook / Shimmer.


0

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

  1. перейти в файл проекта (основной, а не целевой)
  2. щелкните вкладку «Информация» (крайняя слева)
  3. установить правильную конфигурацию модуля для целевого объекта тестов пользовательского интерфейса (раздел «Конфигурации» прямо под «Целевым объектом развертывания»)

Работает!

Нашел в ветке: https://github.com/CocoaPods/CocoaPods/issues/2695

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



0

Очистить проект, очистить папку сборки, перезапустить Xcode. Я просто удаляю путь в проекте goto> Настройки сборки> Поиск по ключевому слову. Swift Compiler - General -> Objective-C Bridging header работал у меня.


0

Август 2019 г.

В моем случае я хотел использовать протокол Swift в файле заголовка Objective-C, который исходит от той же цели, и для этого мне нужно было использовать предварительное объявление протокола Swift, чтобы ссылаться на него в интерфейсе Objective-C. То же самое должно быть справедливо для использования класса Swift в файле заголовка Objective-C. Чтобы использовать предварительное объявление, см. Следующий пример из документации в разделе « Включить классы Swift в заголовки Objective-C с использованием прямых объявлений» :

// MyObjcClass.h
@class MySwiftClass; // class forward declaration
@protocol MySwiftProtocol; // protocol forward declaration

@interface MyObjcClass : NSObject
- (MySwiftClass *)returnSwiftClassInstance;
- (id <MySwiftProtocol>)returnInstanceAdoptingSwiftProtocol;
// ...
@end
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.