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

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

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

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

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

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

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

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


person TomSwift    schedule 20.05.2011    source источник
comment
Боже, я ненавижу функцию редактирования на SO. Здорово, когда кто-то, владеющий английским не на должном уровне, пишет что-то бессмысленное, но кто-то тратит время на его разбор. Но тогда вы получаете людей, которые хотят улучшить ваш вопрос, когда на самом деле они этого не делают. @zoul - изменение названия моего сообщения не улучшило его, поскольку на самом деле мой вопрос более общий, чем просто создание статической библиотеки в Xcode4. Если вы прочитаете вопрос, вы увидите, что он был частью этого, но основная проблема заключается в том, чтобы заставить XCode НАЙТИ И ИСПОЛЬЗОВАТЬ библиотеку, которую я уже успешно создал.   -  person TomSwift    schedule 31.05.2011
comment
у вас всегда есть возможность отменить изменения, если хотите. Я еще раз изменил название, надеюсь, эта версия вас устроит.   -  person zoul    schedule 31.05.2011
comment
@zoul - спасибо. Извините за вентиляцию.   -  person TomSwift    schedule 31.05.2011


Ответы (6)


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

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

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

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

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

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

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

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

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

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

person TomSwift    schedule 20.05.2011
comment
Со всем вышеперечисленным все еще не было ничего, что можно было бы добавить в качестве целевой зависимости. Я мог «собрать для запуска», но не «собрать для архива» (получив ошибку «библиотека не найдена»). Мое довольно уродливое решение состояло в том, чтобы найти проблемную библиотеку в каталоге сборки и перетащить ее в мой проект приложения (без копирования). Xcode теперь знает о своем местоположении, и все строится так, как должно. Это может спасти кого-то еще от выпадения волос. Спасибо за все остальное @TomSwift - person pieSquared; 14.10.2011
comment
Примечание. Общий флажок в диалоговом окне «Управление схемами» не влияет на правильное использование статической библиотеки. Флажок общего доступа определяет только то, будет ли схема видна другим пользователям. - person sean woodward; 06.01.2012
comment
Это отлично работает для меня, за исключением того, что если я что-то изменю в библиотеке, создание проекта, который его использует, не приведет к перестройке библиотеки. Мне нужно вручную собрать библиотеку или очистить/собрать проект, который ее использует. Любые советы о том, как заставить Xcode создать библиотеку по мере необходимости? - person spstanley; 12.04.2012
comment
Я выполнял эти шаги, чтобы включить Facebook-iOS-SDK.xcodeproj в свой проект, но даже после добавления пути поиска заголовков он по-прежнему говорит Facebook.h: Нет такого файла или каталога. Facebook и Apple сводят меня с ума! ! - person Zennichimaro; 11.01.2013

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

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

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

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

person Halle    schedule 25.05.2011

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

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

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

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

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

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

person eonil    schedule 19.06.2011

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

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

Просто помните об именах каталогов. Мои два цента

person Diego Marafetti    schedule 14.11.2011

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

person Tim Keating    schedule 11.03.2013

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

person melissa    schedule 07.03.2013