Xcode 4 и вложенные проекты - файлы заголовков не найдены - PullRequest
52 голосов
/ 24 марта 2011

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

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

  • Перетащите файл .xcodeproj требуемого фреймворка в мой основной проект фреймворка
  • В моем основном фреймворке под TARGETS> MyFramework> Build Phases> Зависимости цели : добавьте цель вложенного проекта
  • Убедитесь, что заголовочные файлы вложенной платформы являются общедоступными
  • В настройках Xcode> Местоположения> Местоположение сборки У меня установлено Поместить продукты сборки в расположение производных данных (рекомендуется)
  • Путь продуктов сборки для обеих целей установлен на ${BUILT_PRODUCTS_DIR} и скажите, что онив DerivedData / Debug (или Release)
  • Параметры архитектуры для обеих целей идентичны

Затем я нажимаю [CMD] + B, чтобы построить, и этоговорит мне, что не находит заголовочные файлы вложенного фреймворка.Когда я проверяю настройки, Пути поиска заголовка пользователя содержат путь к DerivedData / Debug , а внутри находится вложенная целевая структура с файлами заголовков в Versions / A /Заголовки .

Я сижу здесь, кто-нибудь знает, что я делаю неправильно?


Проблема исчезает при сборке для Отладка когда я изменяю пути поиска заголовка пользователя на ${BUILT_PRODUCTS_DIR}/MyFramework.framework/Headers.Однако это не работает при сборке для Distribution , так как фреймворки затем используют свои настройки Release, которые заканчиваются в другом подкаталоге ...


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

Ответы [ 8 ]

53 голосов
/ 26 сентября 2011

Вот мои обобщенные знания:

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

  1. Облегчите боль, убедившись, что все цели имеют то же имя для конфигурации сборки (то есть добавление конфигурации "AdHoc" и "Deployment" в статические библиотеки).

  2. В настройках сборки укажите Пути поиска заголовка (если вы используете #include <file.h>) или Пути поиска заголовка пользователя (если вы используете #include "file.h") к каталогу проекта статической библиотеки.Если проект статической библиотеки в каталоге приложения , используйте это:

    "$(PROJECT_DIR)" ( рекурсивный включен)

    Если у вас есть каталогкоторый содержит а) проект статической библиотеки и б) ваше приложение, тогда это должно работать:

    "$(PROJECT_DIR)/.." ( рекурсивный включен)

  3. Если подмодуль содержит скомпилированные библиотеки, задайте для Пути поиска библиотек значение:

    "$(TARGET_BUILD_DIR)"

  4. Убедитесь, что все проекты статических библиотек, которые выиспользуйте have Skip Install , установленный на YES.

  5. Опять же, нет общедоступных заголовочных файлов (Этапы сборки »Копировать заголовки) в любом изстатические библиотеки, иначе Xcode не сможет заархивировать приложение.

  6. Обязательно сообщите Xcode, когда создавать статические библиотеки, как показано в этом техническом документе от Apple.


Старый ответ:

Я до сих пор не нашел реального решения этой проблемы со статическимбиблиотеки.Что работает для меня:

  • Создание "AdHoc" конфигурации для статической библиотеки
  • Добавление $(BUILT_PRODUCTS_DIR) в пути поиска заголовка пользователя для приложения (с рекурсивным проверено) -> используется при запуске приложения
  • В меню Xcode выберите Продукт > Сборка для > Сборка для архивирования

Это работает, приложение находит заголовочные файлы и создает себя, оно заканчивается в DerivedData // Build / Products / AdHoc-iphoneos / в виде пакета приложения.Следуя этим простым инструкциям (мертвая ссылка) от TestFlightApp.com, я могу упаковать это приложение в IPA и разослать его.Просто выбрав Архив , приложение из Xcode снова не находит заголовки, даже если они действительно находятся в каталоге сборки AdHoc-iphoneos.

3 голосов
/ 11 апреля 2014

(Начиная с Xcode 5.1)

Когда подпроект создается XCode, файлы заголовков подпроекта копируются в каталог сборки.При архивировании кажется, что этот каталог назначения копии не добавляется в заголовок / включает путь поиска.Вы захотите перейти к настройкам сборки и добавить

$(BUILD_ROOT)/../IntermediateBuildFilesPath/UninstalledProducts/include

в «Пути поиска по заголовку» для схемы, которую вы используете для архивирования.

Если вы не уверены, какойсхема используется для архивации, перейдите в Product -> Scheme -> Edit Schemes и найдите Archive в левом столбце.

2 голосов
/ 24 марта 2011

Убедитесь, что ваш сторонний фреймворк добавлен как «группа» в ваш основной проект, чтобы вы могли видеть его в иерархии вашего проекта ...

1 голос
/ 18 августа 2012

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

http://developer.apple.com/library/ios/#DOCUMENTATION/Xcode/Conceptual/ios_development_workflow/AA-Developing_a_Static_Library_and_Incorporating_It_in_Your_Application/archiving_an_application_that_uses_a_static_library.html

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

1 голос
/ 21 апреля 2012

У меня возникла та же проблема с Конфигурацией с именем «Ad Hoc» (согласно рекомендации TestFlight на http://help.testflightapp.com/customer/portal/articles/402782-how-to-create-an-ipa-xcode-4), и основной проект не смог найти некоторые заголовки из вложенных проектов. Я переименовал проект в«AdHoc» (без пробелов) и проблема исчезла, кажется, что пробелы в некоторых случаях могут испортить пути поиска заголовка, хотя я не выяснил, когда это может произойти и почему.

1 голос
/ 17 июля 2011

У меня была такая проблема: я мог создавать конфигурации Debug и App Store, но не Ad Hoc. Сборка Ad Hoc дала мне ошибки, потому что он не мог найти .h файлы, необходимые для вложенных проектов.

Выяснилось, что в моей конфигурации выпуска просрочено предоставление ресурсов. Я обновил эту ссылку, и теперь я могу как собрать Ad Hoc, так и использовать функцию Archive для ее упаковки .

Мне потребовались часы, чтобы понять это! Мой разум просто не перепрыгнул с отсутствующих файлов .h на ошибки инициализации сам по себе. =) Возможно, произошла ошибка или предупреждение с жалобой на отсутствующую инициализацию, но в этом случае она была хорошо зарыта среди сотен ошибок, связанных с .h.

1 голос
/ 25 марта 2011

У меня была такая же проблема, и я мог решить эту проблему, установив «Расположение сборки», чтобы Поместить продукты сборки в местоположения, указанные в целях »

0 голосов
/ 04 октября 2013

Для меня это произошло после слияния GIT, которое создало множество конфликтов, один из которых связан с файлом проекта. Я уверен, что после слияния структура файла проекта изменилась.

Я закончил тем, что вошел в проект «Настройки сборки», затем поискал «Всегда искать пути пользователя» и переключил его на Yes.

Полагаю, слияние превратило это логическое значение в No, поэтому проект не ищет нужные места для заголовочных файлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...