Управление заголовками со статическими библиотеками в Xcode 4 - PullRequest
9 голосов
/ 09 июня 2011

Есть ли лучший способ импорта заголовков статической библиотеки в Xcode 4? Большинство моих проектов зависят от нескольких других проектов, так что недавно я начал использовать функцию рабочей области для сборки всех необходимых модулей из одного места (что я считаю очень удобным).

Отстойно, что мы не можем использовать пользовательские фреймворки на iOS, поэтому зависимости должны быть построены как статические библиотеки, и у меня возникают проблемы с путями поиска по заголовкам. В то время как фреймворки хранят свои заголовки внутри пакета фреймворка, статические библиотеки не имеют такой возможности. Я ненавижу настраивать пути поиска по заголовкам пользователей индивидуально для каждой библиотеки, которую я импортирую. В идеале я хотел бы перетащить проект зависимостей в рабочую область, добавить библиотеку в основную цель и выполнить сборку без дополнительных настроек. Поддерживается ли этот рабочий процесс?

Ответы [ 3 ]

5 голосов
/ 31 августа 2011

Лучшее решение, которое у меня есть на данный момент, - хранить все вспомогательные библиотеки в общей папке (скажем, Support), задав для пути поиска заголовка значение Support/**. Кажется неуклюжим, но работает.

3 голосов
/ 24 октября 2012

То, что я делаю, довольно сложно, но у меня хорошо работает.

В настройках проекта статической библиотеки в разделе «Упаковка» я установил «Расширение Wrapper» на «framework». Я тогда меняю:

"Public Headers Folder Path" to "$(PRODUCT_NAME).$(WRAPPER_EXTENSION)/Headers"

и

"Private Headers Folder Path" to $(PRODUCT_NAME).$(WRAPPER_EXTENSION)/PrivateHeaders

Конечным результатом в продуктах сборки является папка с именем «MyLibraryName.framework», кишки которой выглядят так же, как ... ну ... Framework. В этом мне нравится то, что я могу использовать в своем коде фреймворки в стиле:

#include <MyLibraryName/blah.h>

Недостатком является то, что (как выяснилось в ответе от "zoul") команда "Архивировать" не работает должным образом. Причина, по которой это не работает, заключается в том, что команда Archive разделяет конечные продукты сборки и целевые продукты сборки на отдельные каталоги. Обычная «сборка» этого не делает. Когда вы архивируете, система пытается найти заголовки статических библиотек в конечном каталоге продуктов сборки и не может найти их, потому что система помещает их в целевой каталог сборки для статической библиотеки.

Если вы подумаете об этом, Xcode думает, что у вашей статической библиотеки есть один «продукт». Этот продукт называется "libMyLibraryName.a". Но на самом деле у цели есть два продукта ... один - библиотека, а другой - набор заголовков для библиотеки. Проблема с командой Archive состоит в том, что библиотека копируется как продукт сборки, а заголовки - нет. При попытке запустить архив вы увидите «заголовок не найден».

Чтобы исправить ЭТО, я использую фазу сборки Run Script. Сценарий выглядит так (написано на Ruby):

if ENV["TARGET_BUILD_DIR"] != ENV["BUILT_PRODUCTS_DIR"] then
  $product_name = ENV['PRODUCT_NAME']
  $wrapper_extension = ENV['WRAPPER_EXTENSION']
  $target_build_dir = ENV['TARGET_BUILD_DIR']
  $built_products_dir = ENV['BUILT_PRODUCTS_DIR']

  $source_file = File.join($target_build_dir, $product_name + "." + $wrapper_extension)
  $dest_file = File.join($built_products_dir, $product_name + "." + $wrapper_extension)

  system "ln -s #{$source_file} #{$dest_file}" if File.exist?($source_file)
end

Так что, если каталог сборки Target и каталог собранных продуктов не совпадают ... создайте символическую ссылку на фальшивую "Framework", которую я создал в директории встроенных продуктов.

Как я уже сказал, это сложная схема, но она работает и позволяет мне использовать фреймворки в стиле фреймворка, которые мне нравятся. Весь этот беспорядок был бы значительно упрощен, если бы Xcode позволил разработчикам iOS создавать Frameworks (что также означало бы, что iOS позволила бы разработчикам создавать динамические библиотеки, что Apple неохотно делала), или если бы Apple создала вариант фреймворков ... пакет он содержит статическую библиотеку и заголовки, которые идут вместе с ней (static_framework?), так что у вас есть один продукт сборки, который содержит как заголовки, так и статическую библиотеку.

2 голосов
/ 09 июня 2011

Я понял, что могу установить статические заголовки библиотеки для копирования в папку Headers (вместо значения по умолчанию /usr/local/include). Эта папка появится в папке build-products, и я могу установить Путь поиска заголовка пользователя в $(BUILT_PRODUCTS_DIR) и рекурсивный.

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

...