То, что я делаю, довольно сложно, но у меня хорошо работает.
В настройках проекта статической библиотеки в разделе «Упаковка» я установил «Расширение 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?), так что у вас есть один продукт сборки, который содержит как заголовки, так и статическую библиотеку.