我看到的解决此问题的方案要么显得不够优雅(将标头文件复制到应用程序项目中),要么过于简化以至于仅适用于微不足道的情况。
简短回答
请将以下路径添加到用户标头搜索路径中:
"$(BUILD_ROOT)/../IntermediateBuildFilesPath/UninstalledProducts"
这个方法为什么有效?
首先,我们需要了解问题。在正常情况下,即当您运行、测试、分析或分析性能时,Xcode会构建您的项目并将输出放入 Build/Products/Configuration/Products 目录中,该目录可通过$BUILT_PRODUCTS_DIR宏访问。
关于静态库的大多数指南都建议将公共标头文件夹路径设置为$TARGET_NAME,这意味着您的 lib 文件变成了$BUILT_PRODUCTS_DIR/libTargetName.a,而您的标头文件则被放入$BUILT_PRODUCTS_DIR/TargetName 中。只要您的应用程序在其搜索路径中包含$BUILT_PRODUCTS_DIR,则导入操作在上述四种情况下都可以正常工作。但是,在尝试归档时,此方法将无法工作。
归档的工作方式略有不同
当您归档一个项目时,Xcode会使用一个名为 ArchiveIntermediates 的不同文件夹。在该文件夹中,您将找到 /YourAppName/BuildProductsPath/Release-iphoneos/。这就是在进行归档时$BUILT_PRODUCTS_DIR指向的文件夹。如果您在其中查看,您会发现有一个符号链接指向构建的静态库文件,但标头文件所在的文件夹则缺失了。
要找到标头文件(以及 lib 文件),您需要前往 IntermediateBuildFilesPath/UninstalledProducts/。还记得您被告知设置静态库的跳过安装为YES吗?那么当您进行归档时,此设置就会生效。
顺便提一下:如果您不设置跳过安装,您的头文件将被放置在另一个位置,库文件将被复制到您的档案中,这将防止您导出可提交到App Store的.ipa文件。
经过大量搜索,我找不到与UninstalledProducts文件夹完全对应的宏,因此需要使用"$(BUILD_ROOT)/../IntermediateBuildFilesPath/UninstalledProducts"构建路径。
概要
对于您的静态库,请确保跳过安装,并将公共头文件放置在$TARGET_NAME中。
对于您的应用程序,请将用户头文件搜索路径设置为"$(BUILT_PRODUCTS_DIR)",这适用于常规构建,以及"$(BUILD_ROOT)/../IntermediateBuildFilesPath/UninstalledProducts",这适用于归档构建。