iOS - помилки збірки з CocoaPods не можуть знайти файли заголовків


190

У мене є проект iOS, що використовує CocoaPods. Все працювало без проблем, поки інший розробник не почав працювати над тим же проектом. Він вніс деякі зміни (тільки для того, щоб кодувати, наскільки я знаю) і зробив нову гілку в репо. Я перевірив його відділення і спробував його створити, але я отримую помилку: файл ASLogger / ASLogger.h не знайдено.

Навіть якщо я видалю весь проект і зроблю свіжу копію та використовую "встановити стручки". збій у побудові все ще є. Чи маєте ви якесь уявлення, де може бути проблема? Якщо вам потрібно ще кілька інформації, просто запитайте.


3
Замість використання стилю подвійних цитат, #import "ASLogger.h" я спробував це, #import <ASLogger.h> І це працювало для мене :)
Baig

2
FYI: Проста відповідь Бейга вирішила мою проблему, не знайшовши заголовка.
Pedroinpeace

Відповіді:


205

Оновлення

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

platform :osx, '10.7'
pod 'JSONKit',       '~> 1.4'

link_with 'Pomo', 'Pomo Dev', 'Pomo Tests'

------ Закінчити оновлення


Примітка. Будь ласка, зауважте, що вам потрібно переглянути проект-> Інформація-> Конфігурації для наведених нижче кроків.


У мене були подібні симптоми і з'ясувалося, що pods.xcconfigфайл не включається до конкретних, які targetя намагався створити. Деякі інші запропоновані рішення працювали для мене, але це, здавалося, стосувалося частини основної проблеми.

Pods.xcconfig не працює

Простим рішенням було змінити встановити файл конфігурації для цілей, які не мали одного набору.

Pods.xcconfig працює


4
Для мене "встановити стручки" встановити це лише на першій цілі. Діяння, як було запропоновано у цій відповіді, вирішило мою проблему.
Троя

1
Нарешті рішення: Pods було додано ТІЛЬКО до першої цілі, а не до різних цілей тестового випуску (альфа, бета, кандидат на випуск)! Велика кількість подяк!
JOM

Використовуючи link_withдля визначення моєї іншої цілі, яка працювала на мене. Велике дякую. Я просто витратив на це кілька годин.
Рука Ділана

це працювало для мене! Я клонував існуючий проект, а потім оновив стручки. тож я здогадуюсь, що оновлення стручків перевернуло деякі налаштування, або devio previos використовував xcode 5 чи щось таке (я на xcode 6), дякую !!!
теплиця

4
link_withне підтримується в Cocoapods 1.0 або вище.
Vive

90

Оновлення

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

Якщо заголовки не імпортуються, у вас, ймовірно, виник конфлікт у HEADER_SEARCH_PATHS. Спробуйте додати $(inherited)шляхи пошуку в заголовок у налаштуваннях збірки, щоб переконатися, що він перетягує будь-які шляхи пошуку, що містяться у файлі .xcconfig, з ваших CocoaPods.

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


2
Я зіткнувся з проблемою: файли Pod не виявлялися в додатку, а "виправлена ​​проблема з папкою svn", яка виникає, коли ви видалили або перемістили підкаталоги .svn: Рішення: виконуючи наступні кроки: 1.Установіть CocoaPods з програми так. xcodeproj файл існує (далі: stackoverflow.com/questions/16427421 / ... ) 2.Installed podfiles знову (далі: raywenderlich.com/12139/introduction-to-cocoapods ) 3. $ (успадковується) прапор доданий в ціль '' і HEADER_SEARCH_PATHS 'OTHER_LDFLAGS' програми.
Альфонс Р. Дзуза

1
Вам також може знадобитися додати $ (успадковано) до налаштування FRAMEWORK_SEARCH_PATHS.
Джордж

1
@ AlphonseR.Dsouza ваше рішення працювало на мене - додав $ (успадковано) до OTHER_LDFLAGS завдяки мільйону!
Ніка Касрадзе

3
$ (успадковано) слід додати в налаштуваннях проекту чи в цільових налаштуваннях?
skypirate

У мене були подібні проблеми, у мене не було попереднього досвіду роботи з стручками. У Podfile також не згадував 2 цілі. Так, у мене було 2 цілі. Після того як я згадав 2-ю ціль і оновив файл Pod, цей термінал заявив про попередження, подібне до вашої пропозиції щодо додавання $ успадкованого. Я це зробив, і це прекрасно працювало.
Джасмет

78

1.Перевірити

налаштування побудови -> Шлях пошуку -> Шляхи пошуку в заголовку користувача ->

  • "$ {PODS_ROOT} /" рекурсивна

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

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

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

2.Перевірте стиль імпорту (KEY POINT), якщо ваш podfileвстановлений

use_frameworks!

У вашій File-Bridging-Header.hформі формат повинен такий

#import "MBProgressHUD.h"

інше має бути внизу

#import <MBProgressHUD.h>

3.Та мусить бути робота! Довірся мені


1
Більшість помилок зникає. Однак що робити, коли залежність має заяву про імпорт, наприклад: #import <EARestrictedScrollView / EARestrictedScrollView.h>. Тоді компілятор каже мені замість цього написати #import EARestrictedScrollView.h. Але я не можу змінити свій стручок.
productioncoder

62

Заголовок файлів, ти будеш смертю для мене ...

Нарешті змусив його працювати, додавши (включаючи цитати)

"${PODS_ROOT}/BuildHeaders"

до запису Шляхи пошуку в заголовку користувача та перевірки "рекурсивного".


6
Зауважте, що цитати тут дуже важливі. Без них я не міг би змусити його працювати.
DiscDev

5
+1 Я вже мав $(inherited)(не працював), але додавання цього працювало для мене.
iwasrobbed

Не отримали те, що намагаєтесь сказати. : / Чи можете ви, будь ласка, детальніше розглянути?
rohan-patel

Ще одна зручна хитрість - підірвати робочу область та каталог стручків та встановити стручки свіжими. Це, як правило, більш повне рішення.
averydev

1
Це нарешті допомогло AppCode правильно знайти весь імпорт файлів заголовків. Без цього він працював у xCode, але не в AppCode. Дякую!
sarsonj

52

Я виявив, що ${PODS_HEADERS_SEARCH_PATHS}він відсутній, і він не визначений у моїй гілці розробки git, тому я додав "$(SRCROOT)/Pods/Headers/"до Шляхів пошуку заголовків з рекурсивними

Це для мене нормально


Це була відповідь для мене, я оновив какао і думаю, що це змусило PODS_HEADERS_SEARCH_PATHS піти. Моє рішення було подібним до цього, але я використав "$ (PODS_ROOT) / Headers"
Ендрю Ейткен

Інші відповіді для мене не спрацювали, але ця. Зауважу, що я не включав ", тому мій шлях пошуку в заголовку виглядає приблизно так$(SRCROOT)/Pods/Headers
Blakedallen

@Hlung привіт, куди мені додати $ (SRCROOT) / Pods / Headers /? Оцініть це
VAAA

1
@VAAA Target> Settings settings> Шлях пошуку в заголовку
Hlung

Я думаю, що це правильна відповідь, що слід прийняти, як ви думаєте @Filip Majernik
Ratul Sharker

35

Обидві інші відповіді тут не допомогли. Я знайшов ще 2 проблеми, які могли б виправити:

EDIT Ви можете перевірити симпосилання таким чином: створити текстовий файл під назвою "перевірити" без розширення. скопіюйте ці рядки в нього:

file=/Users/youUserName/XcodeProjectName/Pods/BuildHeaders/SVProgressHUD/SVProgressHUD.h
if [[ ! -e $file &&  -L $file ]]; then
  echo "$file symlink is  broken!"
else
  echo "symlink works"
fi

Потім перейдіть до терміналу, перейдіть до папки, де знаходиться ваш файл перевірки, і введіть

bash check

Велике спасибі! Перший запис вирішив це для мене. Стручки були встановлені лише для першої цілі в нашому проекті. Це складено штрафу, але інша ціль не зробила. Тому я додав також конфігурацію Pods і тепер проблеми вже немає.
mwidmann

Я не бачу "Pods" у Конфігураціях. Це означає, що моє символьне посилання порушено?
Адамські

35

Ось що для мене спрацювало:

Перейдіть на вкладку Ціль> Налаштування побудови та знайдіть налаштування «Шляхи пошуку в заголовку користувача».

Встановіть це на "$ (BUILT_PRODUCTS_DIR)" і встановіть прапорець "Рекурсивний".

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

====

ОНОВЛЕННЯ

Нещодавно у мене була подібна (хоча і дещо інша) проблема. Виявилося, що Xcode не міг знайти Pods, тому що я відкрив .xcodeprojфайл, а не .xcworkspaceфайл. Може допомогти іншим у майбутньому.


1
Це працювало для мене, але лише після виходу з Xcode, запуску pod installта повторного відкриття.
Кен М. Хаггерті

@Snowcrash на яку ціль? ціль стручка чи головна мета проекту?
VAAA

19

Якщо жодне з перерахованого вище не працювало для вас, і ви виявили цю помилку, тому що ви щойно перейшли use_frameworks!у свій Podfile, читайте далі:

Я спробував усі рішення вище та багато іншого, перш ніж дізнався, що мова йде не про шляхи заголовків пошуку в моєму конкретному випадку; це те, що коли ви переходите use_frameworks!у свій Podfile, вам більше не потрібно включати рамки в свій головний мост, і насправді Xcode викине саму непосильну помилку "не в змозі знайти заголовок".

Що вам потрібно зробити, це видалити весь імпорт із мостового файлу заголовка, а натомість використовувати Swift import Moduleу ваших окремих файлах Swift за необхідності, як і для рамок Swift.

І якщо ви використовуєте будь-який із заголовків фреймворку у своїх класах Obj-C (у моєму випадку у нас є клас зручності, який використовував FBSDK), вам потрібно змінити його з локального на глобальний імпорт (це означає змінити #import "Module.h"на #import <Module/Module.h>, яке має автоматично заповнитися для вас, коли ви почнете набирати ім’я фреймворка. У моєму випадку це було <AFNetworking/AFHTTPRequestOperationManager.h>).

Редагувати: з тих пір я дізнався, що при @import Moduleвикористанні файлу парасольки є ще безпечнішим.


16

Ви намагалися імпортувати стиль Cocoapods?

#import <ASLogger.h>

Інформація на сайті не зовсім зрозуміла, я надіслав запит на тягу:

https://github.com/CocoaPods/cocoapods.org/pull/34

Оновлення: Вони витягнули мій запит :)


Замість використання стилю подвійних цитат, #import "ASLogger.h" я спробував це, #import <ASLogger.h> І це працювало для мене :)
Baig

Я пробував це раніше, і це спрацювало на мене, але іноді виникають інші проблеми, коли це не працює. Ви також можете використовувати формат <Podname / Filename.h> принаймні в деяких ситуаціях.
funroll

Так, це працювало і для мене! Жодна кількість очищення та видалення отриманих даних не вирішила це, але це спрацювало.
PostCodeism

10

Вікі дає поради про те, як вирішити цю проблему:

Якщо Xcode не може знайти заголовки залежностей:

Перевірте, чи правильно розміщені файли заголовків підрозділів у колодках / заголовках і чи не переосмислюється HEADER_SEARCH_PATHS (див. №1). Якщо Xcode все ще не може їх знайти, в крайньому випадку ви можете додати імпорт, наприклад, #import "Pods / SSZipArchive.h".


14
Невже хтось може детально розібратися, як "Перевірте, чи правильно розміщені файли заголовків струків у Pods / Headers?"
Дейв Коллінз

будь ласка, дивіться мою відповідь вище, як перевірити
симпосилання

Будь ласка, також перегляньте відповідь головного мозку про Конфігурації, перш ніж керувати операторами імпорту.
Рог

так, деякі стручки посилаються на недійсний каталог, наприклад $(PROJECT_DIR)/Pods/Headers/Public/xxx/ios/xxx.h, є додаткова iosпапка ...
Dong Ma

9

Я був єдиним розробником у команді, яка переживає цю саму проблему, вона прекрасно працювала для всіх, тому я зрозумів, що це моє середовище. Я спробував один git cloneі той же проект в іншому каталозі, і він скомпілювався ідеально, тоді я зрозумів, що це повинен бути файл кешування Xcode десь для мого шляху проекту, що "десь" - це папка DerivedData, просто видаліть її та зробіть чисту конструкцію свого проект, він працював на мене.

Ви можете отримати шлях і навіть відкрити папку в пошуку, перейшовши до:

Xcode -> Preferences -> Locations -> ** DerivedData


1
У моєму випадку проблема з’явилася після оновлення стручків, тому я вважав, що в какаодах слід шукати проблему. Я спробував усі рішення тут не пощастило і, нарешті, просто очистив DerivedData - і це допомогло! дякую
Варрі

3

Я оновлю наведені нижче речі в налаштуваннях збірки, і я не отримав жодних помилок. Щоб перевірити ці речі, оновлюючи какаоподи.

Налаштування побудови

Увімкнути бітовий код - ТАК (якщо ви використовуєте біт-код)

Макропропроцесор - $ (успадковується)

Інший прапор лінкера - objc, -lc ++, $ (успадковується)

Побудувати лише архітектуру

Налагодження - Так

Relese - Ні

Шлях пошуку

Шлях пошуку за рамками - $ (успадковано) $ (PROJECT_DIR)

Шлях пошуку в бібліотеці - $ (успадковується)

Шлях пошуку в заголовку - $ (успадковується)


2

Якщо у вас виникли помилки в будівництві після " встановлення pod " або " оновлення pod ", можливо, один із ваших стручків був побудований з XCode 6.3, поки ви все ще використовуєте попередню версію.

У моєму випадку мені довелося оновити свій OSX від Mavericks до Yosemite, щоб мати Xcode 6.3 і вирішити проблему


Привіт @omaty, це єдине рішення? Зараз я працюю на Mavericks з Xcode 6.2
goelv

1
Привіт @goelv в моєму випадку це було єдине рішення, яке я знайшов. Я був подібний до вас під Mavericks та Xcode 6.2.
Омати

Я думаю, навіть у мене є те саме питання. У мого товариша по команді є Xcode 6.3 в Йосеміті, і він прекрасно справляється з ним, тоді як я намагаюся позбутися заголовка не знайденої проблеми в Mavericks у Xcode 6.2.
Sagar S. Kadookkunnan

1
Продовження: Я також оновив машину до Yosemite і Xcode 6.3.1, зараз я можу створити без будь-яких проблем.
Sagar S. Kadookkunnan

1

для мене проблема полягала у значенні прапорів інших Linker. Чомусь у мене не було лапок на зразок прапорів -l"xml2" -l"Pods-MBProgressHUD".


У мене були проблеми з місцевим кокаоподом Localytics. Під Other Linker Flagsя знайшов два записи: -|Localyticsі |-PodsLocalytics. Я їх видалив, а потім зміг скласти.
Кріс

1

Мені довелося завантажити поштовий індекс з git hub та перетягнути файли, що відсутній, у Finder за відповідними шляхами у Pod / ...


1

Що для мене працювало: вибір проекту Pods, пошук та вибір цільової рамки з відсутнім заголовком у цільовому каталозі проекту Pod та встановлення "Тільки активна архітектура" на "Ні" в розділі "Архітектури" в налаштуваннях цілі збирання.


1

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

  1. Видаліть весь проект
  2. Запустіть проект git clone the project та запустіть bundle exec pod install
  3. cd peoject і запустіть віддалене додавання upstream your-remote-rep-add
  4. git fetch upstream stream
  5. git checkout master
  6. git merge upstream / master

І тоді це працює.


1

Для мене те, що було встановлено, що мета розгортання iOS для мого проекту Pods була нижчою, ніж для самого мого проекту. Як тільки я зробив це так само, як і мій проект, він зміг знайти файл заголовка.


брато! ви заслуговуєте на 1000 грошей. Я затримався з цим протягом 4 годин, і ваше рішення допомогло мені. спасибі багато брато дякую багато!
warzone_fz

0

Я був на насінні GM Xcode 5.0, і я не зміг отримати жодну з цих відповідей. Я спробував кожну відповідь на SO на кілька різних запитань щодо імпорту заголовків без кокапод.

НАЗАД, я знайшов рішення, яке працювало для мене : я перейшов до Xcode 5.0 через Mac AppStore (встановлений поверх насіння GM), і тепер імпорт заголовків працює як очікувалося.

У мене ще була бета-версія Xcode 5 у моїй системі, і я її також видалив. Можливо, це було поєднання двох речей, але, сподіваємось, це допомагає комусь іншому.


0

Це була відповідь для мене, я оновив какао і думаю, що це змусило PODS_HEADERS_SEARCH_PATHS піти. Моє рішення було подібним до цього, але я використав "$ (PODS_ROOT) / Headers" - Ендрю Ейткен

Дуже дякую за цю відповідь. Мені важко було шукати способи виправити свою проблему. Велике спасибі.


0

Жодна з відповідей мені не допомогла (я мав свої стручки пов'язані з усіма цілями, правильно створити конфігурації, правильно встановити контури пошуку "$ (успадковано)" тощо).

Проблема зникла сама по собі після того, як я оновив cocoapods до новітньої версії налагодження за допомогою стандартної команди встановлення / оновлення:

   gem install cocoapods --pre

або:

   sudo gem install cocoapods --pre

(якщо під час встановлення використовувався судо).

Це, мабуть, були какаопові помилки.


0

Одне просте вирішення: 1. Видаліть папку Pods та файл Podfile.lock. Але не видаляйте Podfile 2. Виконайте наступну команду в кореневій папці вашого проекту:

pod install

Я вирішив свою проблему з цим рішенням.
dobiho

0

Ось ще одна причина: усі шляхи до заголовка здалися нормальними, але ми все-таки мали помилку у попередньо складеному (.pch) файлі, який намагався прочитати заголовок стручка

(тобто #import <CocoaLumberjack / CocoaLumberjack.h>).

Дивлячись на вихідну збірку, я нарешті помітив, що помилка порушує нашу ціль розширення Watch OS, а не головну ціль, яку ми будували, оскільки ми також імпортували попередньо скомпільований файл заголовка .pch у цілі Watch OS, і це не вдалося. там. Переконайтесь, що ваші супровідні налаштування Watch OS не намагаються імпортувати файл .pch (особливо якщо ви встановили імпорт із головного цільового налаштування, як я!)


0

Я виявив, що включення бібліотеки як встановлення стручка безпосередньо допомагає динамічним бібліотекам. Наприклад, для Firebase:

pod 'RNFirebase', :path => 'path/to/node_modules/react-native-firebase/ios'

Або для ASLogger:

pod 'ASLogger', :path => 'path/to/node_modules/aslogger/ios' // path to header files

Зміна чи жорстке кодування HEADER_SEARCH_PATHSмені не допомогли. Якщо помилка колись повторюється, не потрібно rm -rf node_modulesні видаляти файл pod тощо, я вважаю корисним очистити кеш.

Для реагуючих рідних я бігаю

    rm -rf $TMPDIR/react-native-packager-cache-*
    rm -rf $TMPDIR/metro-bundler-cache-*
    rm -rf $TMPDIR/metro-* 
    rm -rf $TMPDIR/react-* 
    rm -rf $TMPDIR/haste-*
    rm -rf "$(getconf DARWIN_USER_CACHE_DIR)/org.llvm.clang/ModuleCache"
    npm start -- --reset-cache

Для Xcode я видаляю папки в ~/Library/Developer/Xcode/DerivedData


0

Я думаю, що остаточне рішення - піти Build settings -> Search Path -> User Header Search Paths, знайти свій шлях до бібліотеки та пройти його в Finder. Переконайтесь, що існує весь шлях, включаючи шлях імпорту.

Для мене шлях був коротшим, ніж у підручнику. У підручнику це було щось на кшталт #import <SDK/path/to/sdk/File.h>, але виявляється, це просто#import <SDK/File.h>


-1

У мене є інше відпрацьоване рішення тут,

  1. Закрити Xcode
  2. Відкрийте Xcode та очистіть проект
  3. Створіть проект Pods спочатку
  4. Створити проект


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