Рабочая область с проектом iOS и связанным проектом статической библиотеки - PullRequest
9 голосов
/ 22 марта 2011

Я борюсь с рабочими пространствами Xcode 4.В настоящее время Xcode 4 выигрывает.Таким образом, моя ситуация:

У меня есть рабочее пространство с проектом приложения для iOS.Существует также статическое библиотечное проектное приложение iOS, от которого зависит в этом рабочем пространстве.


Solution # 1

Я пытаюсь настроить так:

  • проект приложения:
    • добавить к цели Фазы сборки> Двоичная ссылка С библиотекой продукта (libmystaticlib.a);
    • установить USER_HEADER_SEARCH_PATHS в $(TARGET_BUILD_DIR)/usr/local/include $(DSTROOT)/usr/local/include;
  • проект статической библиотеки:
    • добавить несколько файлов заголовков к цели Фазы сборки> Копировать заголовки> Общедоступные ;
    • установить SKIP_INSTALL до YES.

И важно: оба проекта должны иметь одинаковые конфигурации.В противном случае, если у меня есть, например, конфигурация с именем Distribution (Ad Hoc) для приложения и Release для статической библиотеки, Xcode не сможет связать приложение с библиотекой.

При такой конфигурации архивация результатов в архив с приложением и общедоступными заголовками из проектов статических библиотек.Конечно, я не могу поделиться *.ipa в этом случае.: (


Solution # 2

Я также попробовал другую конфигурацию:

  • Настройки Xcode:
    • установить дерево исходного кода длястатическая библиотека, например, ADDITIONS_PROJECT;
  • проект приложения:
    • добавление к цели этапы сборки> Link Binary с библиотекой продукта (libmystaticlib.a);
    • установить USER_HEADER_SEARCH_PATHS в $(ADDITIONS_PROJECT)/**;
  • проект статической библиотеки:
    • не добавлять файлы заголовковв Public!;
    • установите SKIP_INSTALL в YES.

Мне все еще нужно позаботиться об именах конфигурации для обоих проектов. Но в результате яможет успешно собрать и заархивировать. В результате я получаю архив и могу поделиться *.ipa.


Мне не нравятся вторые решения, потому что в этом случае я не получаю никакого реального преимуществарабочей области Xcode 4. Тот же эффект, который я могу добавить, получит, если я добавлю статический проект lib в проект приложения. Поэтому, я думаю, что-то не так с моим решением. Любое предложение холучше связать статические библиотеки?

Ответы [ 7 ]

10 голосов
/ 23 июня 2011

Я также нашел решение, которое работает со сборкой и с архивом.
В вашей статической библиотеке установите путь к папке с общими заголовками ../../Headers/YourLib
В настройках вашего приложения установите «Поиск путей заголовка» на $(BUILT_PRODUCTS_DIR)/../../Headers

В вашем приложении вы сможете кодировать #import <YourLib/YourFile.h>

Не забудьте опцию Skip Install = YES в вашей статической библиотеке.

2 голосов
/ 19 декабря 2012

Я не был по-настоящему доволен никакими другими решениями, которые были предоставлены, поэтому я нашел другое решение, которое я предпочитаю.Вместо того, чтобы использовать соответствующие пути для размещения папки / usr / local / include вне каталога установки, я добавил предварительное действие к шагу архивации в моей схеме.В предварительном действии я предоставил скрипт, который удалил каталог usr перед архивированием.

rm -r "$ OBJROOT / ArchiveIntermediates / MyAppName / InstallationBuildProductsLocation / usr"

Это удаляет каталог usr перед архивированием, так что он не попадает в пакет и заставляет Xcode думать, что он имеет несколько модулей.

2 голосов
/ 01 июля 2011

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


Как настроить статическую библиотеку:

  • Добавьте конфигурацию сборки с именем «Архив», скопировав конфигурацию выпуска.
  • Переместите заголовки в группу «Проект» фазы сборки «Копировать заголовки».
  • Установите путь для продуктов сборки для конфигурации «Архив» в $ (BUILD_DIR) / MyLibBuildDir. Xcode создаст папку MyLibBuildDir внутри BuildProductsPath, а затем добавит вашу статическую библиотеку в эту папку. Вы можете использовать «MyLibBuildDir» или указать другое имя для указанной выше папки.
  • Установите Skip Install на YES для всех конфигураций.
  • Установить каталог установки "Archive" в $ (TARGET_TEMP_DIR) /UninstalledProducts.
  • Отредактируйте свою схему, установите для параметра «Конфигурация сборки» своего действия «Архив» значение «Архив».

Как настроить привязку проекта к библиотеке:

  • Добавьте конфигурацию сборки с именем «Архив», скопировав конфигурацию выпуска.
  • Установите для путей поиска в библиотеке "Archive" значение $ (BUILD_DIR) /MyLibBuildDir.
  • Задайте в качестве пути поиска заголовка пользователя рекурсивный абсолютный путь вашего корня каталога рабочей области для всех конфигураций.
  • Установите для параметра «Всегда искать пути пользователя» «Архив» значение YES.
  • Установите для Skip_Install значение NO для всех конфигураций.
  • Отредактируйте схему, установите для параметра «Конфигурация сборки» своего действия «Архив» значение «Архив».
2 голосов
/ 23 марта 2011

Мы нашли ответ, наконец. Ну вроде. Проблема произошла, потому что Xcode 4 помещает публичные заголовки в папку InstallationBuildProductsLocation во время сборки для архива. Видимо, при архивировании он видит заголовки и пытается также поместить их в архив. Изменение пути к общедоступной папке заголовков библиотеки к чему-то за пределами InstallationBuildProductsLocation, например, к $ (DSTROOT) /../ public_folders, и добавление этого пути к пути поиска по заголовку решают проблему. Это решение выглядит не очень элегантно, но для нас оно кажется единственным вариантом. Может быть, вы найдете это полезным.

1 голос
/ 06 ноября 2011

До сих пор я тоже боролся с той же проблемой, но пришел к решению с минимальным компромиссом:

Для этого требуется, чтобы Dervied Data был вашим местоположением сборки. Я установил путь к папке публичных заголовков на ../usr/local/include Это гарантирует, что заголовки не будут помещены в архив.

Для приложения я установил Путь поиска заголовка на: $ (OBJROOT) / USR / местные / включить $ (SYMROOT) / USR / местные / включают

Необходимы 2 записи, поскольку при построении архива пути слегка меняются, и я не понял, как описать его только одной переменной.

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

0 голосов
/ 25 марта 2011

Я мог бы использовать Core Plot как статическую библиотеку и одноуровневую библиотеку с двумя конфигурациями сборки:

Релиз:

  • в проекте, путь поиска заголовка: "$ (BUILT_PRODUCTS_DIR)"
  • в CorePlot-CocoaTouch, путь к общей папке заголовков: / usr / local / include

AdHoc (конфигурация сборки для шага" Архив "в схеме, создает разделяемый файл .ipa):

  • в проекте, путь поиска заголовка: "$ (BUILT_PRODUCTS_DIR)" /../../ public_folders / **
  • в CorePlot-CocoaTouch, путь к папке общих заголовков:../../public_folders

Надеюсь, это поможет кому-то не тратить на это день.

0 голосов
/ 23 марта 2011

Я борюсь с той же проблемой в данный момент. Я не продвинулся намного дальше, чем ты. Я могу только добавить, что во втором решении вы можете перетаскивать заголовки, которые вам необходимо использовать, из библиотеки в проект приложения вместо установки ADDITIONS_PROJECT и USER_HEADER_SEARCH_PATH. Это сделает их видимыми в проекте приложения. В этом случае значение флага SKIP_INSTALL не имеет значения. Тем не менее, это решение не будет работать для меня, потому что я перемещаю довольно большой проект с десятками библиотек с Xcode 3 на Xcode 4, и это действительно требует больших усилий при создании и создании моего проекта. архив правильно. Пожалуйста, дайте нам знать, если вы найдете лучший выход из этой ситуации.

...