我的工作相当复杂,但对我来说效果很好。
在静态库项目的设置中,在“Packaging”部分,我将“Wrapper Extension”设置为“framework”。然后我改变:
"Public Headers Folder Path" to "$(PRODUCT_NAME).$(WRAPPER_EXTENSION)/Headers"
和
"Private Headers Folder Path" to $(PRODUCT_NAME).$(WRAPPER_EXTENSION)/PrivateHeaders
构建产品的最终结果是一个名为“MyLibraryName.framework”的文件夹,其内容看起来就像……嗯……一个框架。我喜欢的一件事是我可以在我的代码中使用框架风格的包含:
#include <MyLibraryName/blah.h>
缺点是(在“zoul”的回答中发现)“存档”命令无法正常工作。它不起作用的原因是因为 Archive 命令将最终构建产品和目标构建产品分隔到单独的目录中。正常的“构建”不会这样做。当您归档时,系统会尝试在最终构建产品目录中查找静态库头文件,但由于系统将它们放在静态库的目标构建目录中,因此无法找到它们。
如果你仔细想想,Xcode 认为你的静态库的目标只有一个“产品”。该产品是“libMyLibraryName.a”。但实际上目标有两种产品……一种是库,另一种是库的标题集。 Archive 命令的问题是库被复制为构建产品,但标题不是。当您尝试运行存档时,最终会出现“找不到标题”。
要解决这个问题,我要做的是使用运行脚本构建阶段。脚本如下所示(用 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
如果目标构建目录和构建产品目录不匹配...创建一个符号链接到我在构建产品目录中创建的假“框架”。
正如我所说,这是一个复杂的方案,但它很有效,让我可以使用我喜欢的框架风格的包含。如果 Xcode 允许 iOS 开发人员创建框架(这也意味着 iOS 允许开发人员创建动态库,这是 Apple 不愿意做的事情),或者如果 Apple 会创建框架的变体……一个包,那么整个混乱将会大大简化包含一个静态库和附带的头文件(一个 static_framework?),这样您就有一个包含头文件和静态库的构建产品。