Отримання “файлу не знайдено” в Bridging Header під час імпорту фреймворків 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. Для "Встановити заголовок сумісності Objective-C" встановлено значення "ТАК".
  2. Шляхи пошуку заголовків включають шлях до фреймворків.

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


3
я забув ввести шлях до бібліотеки Header Search Paths, у цьому випадку питання допомогло: D
Aishwat Singh

Відповіді:


78

Знайшли рішення:

  • Параметр "Мостиковий заголовок" (також SWIFT_OBJC_BRIDGING_HEADER) повинен бути встановлений на цільовому рівні, а НЕ на рівні проекту. Обов’язково видаліть значення налаштування на рівні проекту.

(для мене це здається помилкою Xcode, оскільки я не знаю, чому це виправляє).


1
Це дійсно дивно, у мене була та сама помилка, і виявляється, що я мав заголовок, визначений на рівні проекту. Незважаючи на те, що це вже було визначено на цільовому рівні, мені довелося видалити його з рівня проекту, щоб дозволити додавати сторонні фреймворки. З викликом здається, що це помилка Xcode.
Джоджодмо

2
@MarcoAlmeida, якщо у вас є ціль тестів, спробуйте також видалити з цього налаштування "Заголовок мосту Objective-C". Це повинно допомогти.
Давлат Мірманов 16.03.15

3
Непристойний. Дякую.
Даррен,

1
Гей, там! Майте ту саму проблему тут :( Хоча це не вирішено описаним вище методом ...
Mike K

1
Це спрацювало для мене в Xcode 9.2. Все ще не виправлено через стільки років ...
Олівер Айххорн,

58

У мене те саме питання. Я змінив всі мої імпорту з #import "HMSegmentedControl.h"до #import <HMSegmentedControl/HMSegmentedControl.h>, наприклад.


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

1
Ти бог! Велике спасибі за це.
Альпер

У моєму випадку я перетворив #import <ios-qr-encoder / UIImage + MDQRCode.h> на #import "UIImage + MDQRCode.h", і це спрацювало
Mashhadi,

Ви король
Ітай Спектор

27

Мені довелося додати свій libкаталог у шляхи пошуку заголовка користувача:

налаштування тестової цілі - шлях пошуку заголовка користувача

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

(Я використовую Xcode 6.2 на Mavericks 10.9.5)


1
Я міг вирішити цю проблему, додавши Pods / * до шляхів пошуку заголовків головної цілі. Цікаво, що у мене не було цієї проблеми, перш ніж додати Swift фреймворки як залежності до моєї цілі. Xcode 7 beta 6.
bizz84

Це саме те, що працювало у мене. У моєму проекті є фреймворк, який містить бібліотеку (.a). Мені довелося створити шлях пошуку до заголовків бібліотеки в Шляхах пошуку користувацьких заголовків.
Кріс Лівдал

Також довелось імпортувати папку Pods / library, дякую!
Тібо Ной

17

Ми зіткнулися з тим самим повідомленням про помилку із зовсім іншою причиною.

Налаштування:

  • Ціль програми, весь код Obj-C
  • Ціль одиничного тестування з одним швидким тестовим кейсом і мостиковим заголовком, що посилається на код програми

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

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


5
Дякую. Це абсолютно спрацювало, незважаючи на відсутність абсолютно жодного сенсу.

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

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

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

5

Якщо ви використовуєте cocoapods, спробуйте перевстановити стручки, виконавши наступну команду.

pod install

Це допомогло мені, оскільки я нещодавно створив нову конфігурацію, яка не компілюється (проблема з тим самим файлом не знайдена), тоді як інші конфігурації (налагодження та випуск) були. pod installяк видається, потрібні для будь-яких нових конфігурацій додані ...
Мета

5

Це якось зробило для мене фокус:

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

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

Цей конкретний трюк hit & try вимагає значно менше зусиль, тому не завадить спробувати, поки ви думаєте про інші рішення. ;)
Хлунг

1
На жаль, саме цей трюк "вдари і спробуй" занадто часто є правильною відповіддю.
Роберт Шмід,

5

Ця помилка з'явилася під час встановлення з Cocoapods бібліотеки CocoaImageHashing. Проблема полягала в тому, що шляхи пошуку були неправильними. Отже, на рівні Target у Налаштуваннях збірки -> Шляхи пошуку -> Шляхи пошуку заголовків шляхи відповідали неіснуючим папкам, наприклад "$ {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 не включає Parse, але оскільки воно було визначене у заголовку мостів, воно намагалося його шукати. Я створив новий мостовий заголовок для мого розширення Today, і помилка зникла.


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

2

Мій фреймворк працював раніше і раптом перестав працювати, і жодна з цих відповідей не працювала для мене. Я видалив фреймворк у Фази побудови> Пов’язати двійковий файл з бібліотеками та повторно додав його. Почав працювати знову.


2

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

кокоапод 0,39,0

стрімкий 2.x

XCode 7.3.1

Кроки:

  1. шлях до проекту: ім'я_проекту / ім'я_проекту / ваш_модельний_заголовок.h
  2. У розділі Swift у Параметрі побудови заголовком об'єднання Objective-C має бути: об’єднання project_name / your_bridging_header.h
  3. У файлі your_bridging_header.h змініть усі декларації з .h на #import
  4. У класі, який використовується, ваша_3rd_party . Заявіть про імпорт вашого_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 - імпорт цілі C.

Що слід знати:

  1. Зв'язувальний файл заголовка ПОВИНЕН зберігатись у папці проекту. (тобто не зберігається на тому самому рівні, що зберігається .xcodeproj, а замість цього на один рівень нижче в папки, де зберігаються всі ваші швидкі та цільові c-файли). Він все ще може знайти файл на верхньому рівні, але він не буде коректно посилатись і матиме змогу імпортувати файли Objective C у файл заголовка, що з’єднує.
  2. Мостовий файл заголовка може бути названий як завгодно, якщо він є файлом заголовка .h
  3. Переконайтеся, що шлях у Налаштування збірки> Компілятор Swift - Загальне> Заголовок мосту Objective C правильно вказує на створений вами файл заголовка, який ви створили.
  4. ВАЖЛИВО: якщо ви все ще отримуєте "не знайдено", спробуйте спочатку очистити файл заголовка, що міститься, і стерти всі імпорти, які ви зараз там записали. Будьте впевнені, що спочатку можна знайти файл заголовка, що міститься, а потім почніть додавати імпорт цілі c до цього файлу. З якоїсь причини вона відхилить ту саму помилку "не знайдено", навіть якщо вона знайдена, але їй не подобається імпорт, який ви намагаєтесь з якоїсь причини
  5. Ви не повинні # імпортувати "MyBridgingHeaderFile.h" у жодному з ваших цільових C-файлів. Це також призведе до помилки "файл не знайдений"

1
Усі ці пункти перевірені і все ще мають однакову проблему: (Будь-які подальші пункти слід брати до уваги?
Амджад Хуссейні,

@AmjadHusseini спробуйте очистити файли проекту, потім очистити похідні дані проекту, а потім перезапустити xCode. це працювало зі мною
Мохаммад Аллам,

0

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

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

Я користувався бібліотекою facebook / Shimmer.


0

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

  1. перейти до файлу проекту (головний не цільовий)
  2. натисніть на вкладку "Інформація" (зліва зліва)
  3. встановити правильну конфігурацію модуля для цілі тестування інтерфейсу користувача (розділ "Конфігурації" прямо під "Ціль розгортання")

Працюючи!

Я знайшов його в темі: https://github.com/CocoaPods/CocoaPods/issues/2695

Звучить трохи як помилка для стручків какао, але я бачу причини, чому це може бути складно.



0

Чистий проект, Чиста папка збірки, Перезапустіть Xcode. я просто видаляю шлях у goto проекту> Параметри побудови> Шукати за ключовим словом. Swift Compiler - Загальне -> Заголовок Objective-C Bridging працював у мене.


0

Серпень 2019 року

У моєму випадку я хотів використовувати протокол Swift у файлі заголовка Objective-C, який надходить з тієї ж мети, і для цього мені потрібно було використати пряму декларацію протоколу Swift для посилання на нього в інтерфейсі Objective-C. Те саме має бути справедливим для використання класу Swift у файлі заголовка Objective-C. Щоб використовувати переадресацію, перегляньте наступний приклад із документів у розділі Включити швидкі класи в заголовки 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.