iOS - сборка завершается неудачно с CocoaPods не удается найти заголовочные файлы


190

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

Даже если я удалю весь проект, сделаю новую копию и использую «pods install». сбой сборки все еще там. У вас есть идеи, где может быть проблема? Если вам нужно больше информации, просто спросите.


3
Вместо использования стиля двойной кавычки, #import "ASLogger.h" я попробовал это, #import <ASLogger.h> И это сработало для меня :)
Baig

2
К вашему сведению: Baigs простым ответом решил мою проблему, не найдя заголовок.
Pedroinpeace

Ответы:


205

Обновить

Убедитесь , что ваш Podfileвключает в себя link_withпо мишеням , пропускающих конфигурационный файл. В противном случае Cocoapods устанавливает только первую цель по умолчанию . например

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

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

------ Конец обновления


Примечание. Обращаем ваше внимание на то, что вы должны изучить Project-> Info-> Configurations для следующих шагов.


У меня были похожие симптомы, и я обнаружил, что pods.xcconfigфайл не включен в конкретную информацию, которую targetя пытался создать. Некоторые из других предложенных решений работали для меня, но это, казалось, решало часть основной проблемы.

Pods.xcconfig не работает

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

Pods.xcconfig работает


4
Для меня '' pods install '' устанавливает это только для первой цели. Выполнение, как предложено в этом ответе, решило мою проблему.
Троя

1
Наконец, решение: Pods был добавлен ТОЛЬКО к первой цели, а не к различным целям тестового выпуска (альфа, бета, релиз-кандидат)! Большое спасибо!
JOM

Использование link_withдля указания моей другой цели сработало для меня. Большое спасибо. Я просто потратил несколько часов на это.
Дилан Хэнд

это сработало для меня! я клонировал существующий проект, а затем обновил модули. так что я предполагаю, что обновление pods изменило некоторые настройки, или предыдущий разработчик использовал 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. Снова установил подфайлы (по ссылке : raywenderlich.com/12139/introduction-to-cocoapods ) 3. В целевой 'HEADER_SEARCH_PATHS' добавлен флаг $ (наследуется) и «OTHER_LDFLAGS» приложения.
Альфонс Р. Дсуза,

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

1
@ AlphonseR.Dsouza, ваше решение сработало для меня - добавил $ (унаследовано) к OTHER_LDFLAGS, спасибо миллион!
Ника Касрадзе

3
$ (наследуется) нужно добавить в настройки проекта или настройки цели?
Скайпират

У меня была похожая проблема, у меня не было опыта работы со стручками. В Podfile я также не упомянул 2 цели. Да, у меня было 2 цели. Как только я упомянул о 2-й цели и обновил файл Pod, терминал выдал несколько предупреждений, похожих на ваше предложение добавить наследуемый $. Я сделал, и это сработало отлично.
Жасмит

78

1.Check

Настройки сборки -> Путь поиска -> Пути поиска в заголовке пользователя ->

  • "$ {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. Но я не могу изменить свой модуль.
продакшер

62

Заголовочные файлы, ты будешь моей смертью ...

Наконец получил его на работу, добавив (включая кавычки)

"${PODS_ROOT}/BuildHeaders"

к записи «Пути поиска заголовка пользователя» и проверке «рекурсивно».


6
Обратите внимание, что цитаты очень важны здесь. Без них я не смог бы заставить его работать.
DiscDev

5
+1 Я уже имел $(inherited)(не работал), но добавление этого работало для меня.
iwasrobbed

Не понял, что вы пытаетесь сказать. : / Не могли бы вы уточнить?
Рохан-Патель

Еще один удобный трюк - удалить каталог рабочей области и pods и установить pod заново. Как правило, это более полное решение.
августа

1
Это, наконец, помогло AppCode правильно найти все импортируемые файлы заголовков. Без этого он работал в xCode, но не в AppCode. Спасибо!
sarsonj

52

Я обнаружил, ${PODS_HEADERS_SEARCH_PATHS}что отсутствует и не определен в моей ветке git для разработки, поэтому я добавил "$(SRCROOT)/Pods/Headers/"рекурсивные пути поиска по заголовкам

Это нормально для меня


Это был ответ для меня, я обновил cocoapods, и я думаю, что это заставило PODS_HEADERS_SEARCH_PATHS уйти. Мое решение было похоже на это, но я использовал "$ (PODS_ROOT) / Заголовки"
Эндрю Айткен

Другие ответы не сработали для меня, но этот сработал. Я отмечу, что я не включил ", поэтому мой путь поиска в заголовке выглядит следующим образом$(SRCROOT)/Pods/Headers
Blakedallen

@ Здравствуйте, где я должен добавить $ (SRCROOT) / Pods / Headers /?
Ценю

1
@VAAA Target> Настройки сборки> Путь поиска в заголовке
Hlung

я думаю, что это правильный ответ, что должно быть принято, что вы думаете @Filip Majernik
Ratul Sharker

35

Оба других ответа здесь не помогли. Я нашел 2 другие проблемы, которые могут это исправить:

РЕДАКТИРОВАТЬ Вы можете проверить символическую ссылку следующим образом: создать текстовый файл с именем «проверить» без расширения. скопируйте эти строки в это:

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

Я не вижу «Стручки» в Конфигурациях. Означает ли это, что моя символическая ссылка не работает?
Адамски

35

Вот что сработало для меня:

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

Установите для этого параметра значение «$ (BUILT_PRODUCTS_DIR)» и установите флажок «Рекурсивно».

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

====

ОБНОВИТЬ

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


1
Это сработало для меня, но только после выхода из Xcode, запуска pod installи повторного открытия.
Кен М. Хаггерти

@ Snowcrash, что цель? цель pod или основная цель проекта?
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
Может ли кто-нибудь уточнить, как именно «Проверить, правильно ли обозначены файлы заголовков модуля в модулях / заголовках», пожалуйста?
Дейв Коллинз

пожалуйста, смотрите мой ответ выше о том, как проверить символическую ссылку
brainray

Пожалуйста, ознакомьтесь с ответом Brainray о конфигурациях, прежде чем искажать свои операторы импорта.
Рог

да, некоторые модули ссылаются на неверный каталог, например $(PROJECT_DIR)/Pods/Headers/Public/xxx/ios/xxx.h, есть дополнительная iosпапка ...
Донг Ма

9

Я был единственным разработчиком в команде, столкнувшейся с такой же проблемой, она отлично работала для всех, поэтому я понял, что это должна быть моя среда. Я попробовалgit clone тот же проект в другом каталоге, и он отлично скомпилировался, затем я понял, что это должно быть что-то вроде кэширования Xcode для пути моего проекта, где-то где-то есть папка DerivedData, просто удалите ее и выполните чистую сборку вашего проект, он работал для меня.

Вы можете получить путь и даже открыть папку в Finder, перейдя в:

Xcode -> Настройки -> Местоположения -> ** DerivedData


1
В моем случае проблема появилась после обновления стручков, поэтому я подумал, что в cocoapods следует искать проблему. Я попробовал все решения здесь безуспешно и, наконец, просто очистил DerivedData - и это помогло! спасибо
Варрри

3

Я буду обновлять нижеприведенные вещи в своих настройках сборки, и я не получил никаких ошибок. Чтобы проверить эти вещи при обновлении ваших cocoapods.

Настройки сборки

Включить битовый код - ДА (если вы используете битовый код)

Макропроцессор - $ (наследуется)

Другой флаг компоновщика - objc, -lc ++, $ (наследуется)

Строить только архитектуру

Отладка - да

Релес - Нет

Путь поиска

Каркасный путь поиска - $ (наследуется) $ (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 в Yosemite, и он прекрасно работает для него, тогда как я изо всех сил пытаюсь избавиться от проблемы с заголовком, не найденной в Mavericks в Xcode 6.2.
Сагар С. Кадукуннан

1
Продолжение: я также обновил машину до Yosemite и Xcode 6.3.1, теперь я могу собрать без проблем.
Сагар С. Кадукуннан

1

для меня проблема была в значении Other Linker flags. По какой-то причине у меня не было кавычек в флагах, как -l"xml2" -l"Pods-MBProgressHUD".


У меня были проблемы с Cocoapod от Localytics. Под Other Linker Flagsя нашел две записи: -|Localyticsа |-PodsLocalytics. Я удалил их и смог собрать.
Крис

1

Мне пришлось скачать zip из git hub и перетащить недостающие файлы в Finder по соответствующим путям в Pod / ...


1

Для меня сработало то, что я выбрал проект Pods, нашел и выбрал целевую платформу с отсутствующим заголовком в целевом каталоге проекта Pod и установил «Build Active Architecture Only» на «No» в «Architectures» в настройках сборки цели.


1

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

  1. Удалить весь проект
  2. Запустите git clone проекта и запустите пакет exec pod install
  3. cd peoject и запустить удаленное добавление upstream your-remote-rep-add
  4. мерзавец получить вверх по течению
  5. мастер проверки git
  6. git merge upstream / master

И тогда это работает.


1

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


брат! Вы заслуживаете 1000 голосов. я застрял с этим в течение 4 часов, и ваше решение помогло мне. спасибо большое братан большое спасибо!
warzone_fz

0

Я был на GM-семени Xcode 5.0 и не мог заставить ни один из этих ответов работать. Я попробовал каждый отдельный ответ на SO на несколько разных вопросов об импорте заголовков с cocoapods.

Наконец, я нашел решение, которое сработало для меня : я обновился до Xcode 5.0 через Mac AppStore (установлен поверх GM-семени), и теперь импорт заголовков работает как положено.

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


0

Это был ответ для меня, я обновил cocoapods, и я думаю, что это заставило PODS_HEADERS_SEARCH_PATHS уйти. Мое решение было похоже на это, но я использовал "$ (PODS_ROOT) / Заголовки" - Эндрю Айткен

Большое вам спасибо за этот ответ. Мне было трудно искать способы решить мою проблему. Большое спасибо.


0

Ни один из ответов не помог мне (у меня были свои модули, связанные со всеми целями, правильная настройка конфигураций, правильные пути поиска $ (наследуемый) и т. Д.).

Проблема исчезла сама собой после того, как я обновил cocoapods до новейшей отладочной версии, используя стандартную команду установки / обновления:

   gem install cocoapods --pre

или:

   sudo gem install cocoapods --pre

(если sudo использовалось во время установки).

Должно быть, это ошибка кокоапод.


0

Один простой обходной путь: 1. Удалите папку Pods и файл Podfile.lock. Но не удаляйте Podfile 2. Запустите следующую команду в корневой папке вашего проекта:

pod install

Я исправил мою проблему с этим решением.
Добихо

0

Вот еще одна причина: все пути к заголовкам выглядели нормально, но у нас все еще была ошибка в предварительно скомпилированном (.pch) файле при попытке прочитать заголовок pod

(т.е. #import <CocoaLumberjack / CocoaLumberjack.h>).

Глядя на исходные данные сборки, я наконец-то заметил, что ошибка нарушала нашу цель расширения OS Watch, а не основную цель, которую мы строили, потому что мы также импортировали предварительно скомпилированный заголовочный файл .pch в цели Watch OS, и это не удавалось. там. Убедитесь, что прилагаемые настройки цели Watch OS не пытаются импортировать файл .pch (особенно если вы установили этот импорт из основной настройки цели, как я!)


0

Я обнаружил, что включение библиотеки в качестве модуля pod напрямую помогает динамическим библиотекам. Например, для 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.