Статические библиотеки в Xcode 4 - PullRequest
41 голосов
/ 20 мая 2011

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

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

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

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

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

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

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

Ответы [ 6 ]

55 голосов
/ 20 мая 2011

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

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

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

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

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

  • Я должен был убедиться, что рабочая область была настроена для размещения результатов сборки в общую папку.В диалоговом окне «Параметры рабочего пространства» установите для параметра «Расположение сборки» значение «Поместить продукты сборки в расположение производных данных»

  • Мне также нужно было установить флажок «Общий доступ» для каждого проекта вдиалоговое окно «Управление схемами».

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

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

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

6 голосов
/ 25 мая 2011

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

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

Это основано на моих инструкцияхдля моей собственной библиотеки.Я думаю, что пропущенный шаг в вашем исходном процессе заключается в том, что вы не добавляете статическую библиотеку в проект приложения как целевую зависимость (шаг 3 в моих инструкциях) в то же время, когда связываете ее в «Связать двоичные файлы с библиотеками».Вам также может понадобиться выполнить шаг № 5 в зависимости от того, как заголовки связаны с проектом статической библиотеки.

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

3 голосов
/ 19 июня 2011

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

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

Редактировать

Для дальнейшего использования.

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

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

2 голосов
/ 14 ноября 2011

У меня была такая же проблема с моей командой. Один из разработчиков страдал от этой проблемы, однако мой xcode смог скомпилировать и правильно нашел заголовок. Кстати: все «Настройки сборки» были правильно настроены (всегда ищите пути пользователя, пути заголовка пользователя и т. Д.).

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

Просто будьте внимательны с именами каталогов. Мои два цента

1 голос
/ 12 марта 2013

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

0 голосов
/ 07 марта 2013

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

...