Как правильно настроить рабочие пространства Xcode 4 для построения зависимостей при необходимости?

Мой случай прост, рабочее пространство с двумя дочерними проектами: одно основное (iOS) приложение и проект, который создает несколько целевых статических библиотек, используемых приложением.

Вот как я настроил сборку:

  • указал "путь поиска заголовка пользователя" в основных настройках сборки приложения в расположение проекта библиотеки (через исходное дерево).
  • в главном целевом редакторе приложения → фазах сборки → "Связывание двоичных файлов с библиотеками", добавлены библиотеки, которые я хочу использовать.
  • в схеме, отметьте "Найти неявные зависимости"

После очистки (и удаления производных данных) сборка связывает меня с этой ошибкой во время сборки основного проекта:

ld: library not found for -lChipmunk
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Command /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/clang failed with exit code 1

Разумеется, если я посмотрю на вновь созданные производные данные, единственными объектными файлами, которые будут найдены, являются основное приложение, а не библиотеки. Широко распространенный "поиск" для файлов *.o не показывает ничего значимого, поэтому библиотеки не теряются, они определенно не создаются.

Некоторые дополнительные точки:

  • когда я спросил об этом на форумах Apple dev, было предложено добавить явные отпечатки в главный редактор Build Phases- > Target Dependencies. Но вы можете добавлять только отпечатки сюда к целевым объектам в одном проекте или подпроектах; в моем случае у меня есть проекты приложений и библиотек как братья и сестры на рабочем месте.
  • Если я строю каждую библиотеку вручную перед основной сборкой, все в порядке.

Обновление:

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

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

Ответ 1

Редактирование схемы (замена объектов сборки, un-/check "Parallelize Build" и/или "Поиск неявных зависимостей" ) не сработала для меня. Мне все еще пришлось очистить проект, после изменения кода в статической библиотеке. Поиск в форумах dev, наконец, нашел этот ответ, который творит чудеса.

Убедитесь, что инспектор Identity и Type отображается и выбирает файл libWhatever.a в вашем проекте приложения (а не в библиотеке). Если вы видите местоположение: относительно проекта [или относительно группы], это ваша проблема.

  • Нажмите "Относительно проекта" и измените его на "Относительно сборки" Продукты.
  • Это изменит тип ссылки, но все равно будет быть сломанным.
  • Нажмите кнопку определения местоположения и найдите выходной файл.

Добавление статического lib в существующий проект через Build Phases → Link Binary with Libraries автоматически делает его "относительным к группе" (если оба являются братьями и сестрами в одном и том же рабочем пространстве). Изменив свое местоположение, описанный выше способ устраняет проблему зависимости сборки и в навигаторе проекта ваш файл .a должен появляться черными буквами (вместо красного).

Ответ 2

Я описал способ создания нескольких проектов в рабочей области здесь: http://blog.carbonfive.com/2011/04/04/using-open-source-static-libraries-in-xcode-4/

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


Изменить: по возможности я рекомендую использовать https://github.com/CocoaPods/CocoaPods для управления зависимостями проекта на этом этапе.

Ответ 3

Попробуйте перетащить проект библиотеки в основной проект:

library project reference inside main project

Ответ 4

В моем случае, единственный способ, которым я мог бы построить эту сборку, - вручную добавить путь "../MyLibProject/build/Debug-iphoneos" (проверяя рекурсивность, чтобы убедиться) в моих настройках сборки → Библиотека Пути поиска. Добавление файла .a только в Основной проект не помешало ошибке "lib not found" при времени ссылки.