Статические библиотеки в Xcode 4

(Мой вопрос задавался здесь раньше, но без рабочих ответов, которые я могу видеть. Рабочее пространство Xcode4 с проектом и проектом проекта статической библиотеки)

Я пытаюсь использовать библиотеку, предоставленную третьей стороной. Они предоставляют проект XCode, который создает файл libLibraryName.a. Они рекомендуют добавить проект в качестве подпроекта в свой собственный, а затем добавить файл продукта libLibraryName.a в набор библиотек, описанных в моих настройках проекта "Link Binary with Libraries".

Библиотека правильно построена: генерируется файл .a. Но проект показывает красный файл libLibraryName.a в группе "Продукты". Я не могу заставить его потемнеть. И родительский проект говорит, что он не может найти LibraryName для ссылки.

В качестве теста я создал новый проект статической библиотеки, используя шаблон статической библиотеки XCode 4. Этот проект демонстрирует то же поведение: продукт никогда не отображается "черным", даже если файл .a построен. ( Изменить: черное, если вы создаете устройство, а не симулятор).

Я знаю, что XCode 4 по умолчанию помещает промежуточные и файлы продуктов в общую папку. Я пробовал этот параметр, и я изменил настройку, чтобы поместить файлы продукта в папки, описанные в настройках сборки. Ни одна из этих настроек не работает.

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

Что дает? Как получить проект статической библиотеки, чтобы узнать, где он построил продукт, и впоследствии ссылаться на этот продукт в другом проекте?

Ответ 1

Множество прыжков с обручем, но вот мои заметки теперь, когда я его работаю.

  • Если вы создаете новый проект XCode4 iOS "Cocoa Touch Static Library" (и добавьте ему некоторый код), проект построит штраф из коробки. Но файл продукта libLibraryName.a только становится черным (из красного, обозначая, что файл не существует), когда вы делаете сборку устройства. Симулятор сборки не показывает, что цель была построена, когда на самом деле это было.

  • В целевых настройках сборки проекта "Путь к продуктам для каждой конфигурации" по умолчанию равен $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) Если вы измените это на что-то другое (или если вы обновили проект с XCode3.x, который использовал $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)$(IPHONEOS_DEPLOYMENT_TARGET) как по умолчанию, я считаю), то файл продукта libLibraryName.a никогда не станет черным. Для меня это говорит о наличии ошибки в XCode где-то.

  • Я могу жить без файла Product, становящегося черным после сборки (это хороший индикатор, но эй, что бы то ни было). Но мне нужно, чтобы мой потребительский проект мог найти правильную сборку библиотеки, будь то симулятор или устройство. В идеальном мире в нем будет один файл .a с битами i386/arm6/arm7, но опять же, это не мой проект библиотеки/библиотеки.

  • XCode4 Transition Guide - это то, что показало мне свет. Он предписывает создать рабочую область, в которой размещаются оба проекта, и они будут встраиваться в один и тот же общий каталог сборки. Я ранее не использовал рабочую область, поэтому я использовал команду "Файл/Сохранить как Workspace" для создания нового файла рабочей области. Затем я добавил проект библиотеки, позаботясь о том, чтобы он был помещен как одноранговый узел в мой основной проект, а не как ребенок.

  • Мне нужно было убедиться, что рабочее пространство настроено для размещения вывода сборки в общей папке. В диалоговом окне "Параметры рабочей области" установите для параметра "Место сборки" значение "Поместить сборку в исходное местоположение данных"

  • Я также должен был проверить флажок "общий" для каждого проекта в диалоговом окне "Управление схемами".

  • Наконец, чтобы указать зависимость библиотеки от моего основного проекта, я просто перешел на вкладку "Сборка фаз", ссылку "Связывание с библиотеками" и нажал "+", затем выбрал файл libLibraryName.a из под папке Workspace. Обратите внимание, что я пробовал это раньше, когда не было никакого рабочего пространства и не было общего типа dir, и в результате XCode не смог найти файл .a во время ссылки.

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

Я был бы рад прочитать о любом другом опыте со всем этим, или о любых отзывах о других (более простых) способах создания ссылок на статические библиотеки.

Ответ 2

Посмотрите мой ответ здесь и посмотрите, поможет ли он вам:

Связывание статической библиотеки с проектом iOS в XCode 4

Они основаны на моих инструкциях для моей собственной библиотеки. Я считаю, что отсутствующий шаг в исходном процессе состоит в том, что вы не добавляете статическую библиотеку в проект приложения как целевую зависимость (шаг 3 в моих инструкциях), в то же время, когда вы связываете ее в "Link Binary with Libraries". Вам также может потребоваться выполнить шаг № 5 в зависимости от того, как заголовки связаны статическим библиотечным проектом.

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

Ответ 3

Взгляните на мою заметку по и Открыть запись радара.

Красный цвет node - это ошибка Xcode. Вы можете заставить его работать, изменив SDKROOT на настройку сборки Проект. Настройки целевой сборки не будут работать для отображения и поддержки IDE.

Изменить

Для более поздней справки.

В настоящее время мое мнение изменено на проект Xcode, который не может полностью работать с несколькими платформами. Хотя он может отображать несколько платформ, но только одна платформа может быть выбрана за один раз для отображения экрана с помощью параметра SDKROOT. Если вы выберете iOS, он будет использовать что-то вроде Debug-iphoneos для сборки пути продукта. Таким образом, все цели Mac OS X будут отсутствовать. Если вы выберете Mac OS X, он будет использовать что-то вроде Debug. Таким образом, все продукты iOS-целей будут отсутствовать.

Я думаю, что Xcode все еще имеет внутреннюю ошибку, связанную с этим. Это долгое время, чтобы сделать Xcode стабилизированным.

Ответ 4

У меня была такая же проблема с моей командой. Один из разработчиков страдал этой проблемой, однако мой xcode смог скомпилировать и правильно найти заголовок. BTW: все "настройки сборки" были правильно настроены (всегда ищут пути пользователя, пути пользовательских заголовков и т.д.).

Я понял, что его проект был в каталоге с пробелами на своем пути (../my project/blah.xcodeproj). Изменив это, Xcode смог найти заголовки из статической библиотеки в одном и том же рабочем пространстве.

Просто знайте имена каталогов. Мои два цента

Ответ 5

Одна поясняющая деталь (после того, как вы выкапываете результат сборки до тех пор, пока я не начну переходить через косые глаза): если вы находите, что заголовки вашей библиотеки экспортируются в Build/Products/Debug, а ваш родительский проект ищет Build/Products/Debug-iphonesimulator, ваша библиотека построенный для OS X, а не iOS. Вы можете изменить это в настройках "Поддерживаемые платформы" в разделе "Архитектуры" параметров проекта. OS X, по-видимому, является настройкой по умолчанию, если вы создаете проект статической библиотеки villa для С++, поэтому эту ситуацию достаточно легко встретить.

Ответ 6

У меня была проблема с одной из моих библиотек. У меня на самом деле есть еще 4 библиотеки, которые я строю, которые включены, которые выглядят отлично, появляются черные, но нет. Моя красная библиотека была решена путем изменения базового SDK в настройках сборки проекта библиотеки. Поскольку библиотека могла создавать для Mac OS X и iOS, она была настроена на Mac OS X. Исходная библиотека iOS по-прежнему построена, но никогда не становилась черной. Как только я изменил настройку базовой SDK, чтобы быть последней iOS, моя библиотека превратилась в черную.