Xcode 4无法从静态库依赖关系找到公共头文件
备用标题来帮助搜索
我正在开发一个来自Xcode 3的iOS应用程序项目。现在我已经转移到了Xcode 4,我的项目构建了一些静态库。
那些静态库也声明公共头文件,这些头文件被应用程序代码使用。 在Xcode 3.x中,头部被复制(作为构建阶段)到public headers directory
,然后在应用程序项目中public headers directory
被添加到headers search list
。
在Xcode 4下,构建目录被移动到~/Library/Developer/Xcode/DerivedData/my-project
。
问题是我如何在标题搜索设置中引用这个新位置? 看起来:
public headers directory
与DerivedData
目录相关,但是 headers search
目录是相对于别的东西(可能是项目位置) 我应该如何在Xcode 4中为iOS开发设置一个静态库目标,以确保在试图编译为依赖时,头文件可供使用静态库的客户端使用?
我对这个问题看到的每种解决方案都显得不够优雅(将头文件复制到应用程序的项目中),或者过分简化为只能在微不足道的情况下工作。
简短的答案
将以下路径添加到您的用户标题搜索路径
“$(BUILD_ROOT)/../ IntermediateBuildFilesPath / UninstalledProducts”
为什么这个工作?
首先,我们需要了解问题。 在正常情况下,即运行,测试,配置文件或分析时,Xcode会构建您的项目并将输出放入Build / Products / Configuration / Products目录中,该目录可通过$ BUILT_PRODUCTS_DIR宏获得。
有关静态库的大多数指南建议将Public Headers文件夹路径设置为$ TARGET_NAME ,这意味着您的lib文件变为$ BUILT_PRODUCTS_DIR /libTargetName.a,并且您的头文件将放入$ BUILT_PRODUCTS_DIR / TargetName中。 只要您的应用程序在搜索路径中包含$ BUILT_PRODUCTS_DIR ,那么导入就可以在上述4种情况下运行。 但是,当您尝试归档时,这不起作用。
存档工作有点不同
归档项目时,Xcode使用名为ArchiveIntermediates的不同文件夹。 在该文件夹中,您会找到/ YourAppName / BuildProductsPath / Release-iphoneos /。 这是您执行归档时$ BUILT_PRODUCTS_DIR指向的文件夹。 如果你看看那里,你会发现你的内置静态库文件有一个符号链接,但是缺少包含头文件的文件夹。
要找到标题(和lib文件),您需要转到IntermediateBuildFilesPath / UninstalledProducts /。 还记得当你被告知为静态库设置跳过安装为YES吗? 那么当你创建一个存档时,这是设置的效果。
注意:如果你没有将它设置为跳过安装,你的头文件将被放到另一个位置,lib文件将被复制到你的压缩文件中,从而阻止你导出一个可以提交给App Store的.ipa文件。
经过大量搜索之后,我找不到任何与UninstalledProducts文件夹完全对应的宏,因此需要使用“$(BUILD_ROOT)/../ IntermediateBuildFilesPath / UninstalledProducts”构建路径
概要
对于您的静态库,请确保您跳过安装,并且您的公共头文件被放置在$ TARGET_NAME中。
对于您的应用程序,请将用户标题搜索路径设置为“$(BUILT_PRODUCTS_DIR)”(适用于常规构建),而“$(BUILD_ROOT)/../ IntermediateBuildFilesPath / UninstalledProducts”适用于存档构建。
在开发自己的静态库时遇到了同样的问题,虽然Colin的回答非常有帮助,但我不得不对其进行修改,以便在Xcode 4下使用Workspace运行和归档项目时一致地工作。
我的方法有什么不同之处在于您可以为所有构建配置使用单个用户头部路径。
我的方法如下:
创建一个工作区
静态库项目设置
包括/库名称
我从RestKit的使用中采纳了这一点,并发现它对我所有的静态库最有效。 这是告诉Xcode将我们移动到第1步中的“公共”标题部分的所有标题复制到我们在此处指定的文件夹,该文件夹位于构建时的Derived Data文件夹中。 与RestKit一样,我喜欢使用单个“包含”文件夹来包含我在项目中使用的每个静态库。
我也不喜欢在这里使用宏,因为它可以让我们稍后在使用静态库配置项目时使用单个用户头部搜索路径。
使用静态库的项目设置
在相同的区域找到用户标题搜索路径并添加:
“$(PROJECT_TEMP_DIR)/../ UninstalledProducts /包括”
这告诉Xcode在构建过程中在Xcode创建的中间构建文件夹中查找静态库。 在这里,我们有我们用于静态库位置的“包含”文件夹,我们在步骤2中为静态库项目设置进行设置。 这是让Xcode正确找到你的静态库的最重要的一步。
配置工作区
在这里,我们要配置工作区,以便在构建应用程序时构建静态库。 这是通过编辑用于我们的应用程序的方案完成的。
开始使用库
现在,您应该可以使用导入静态库
import <LibraryName/LibraryName.h>
这种方法避免了为不同的配置设置不同的用户头文件路径的麻烦,所以编译归档文件时应该没有问题。
为什么这个工作?
这一切都取决于这条道路:
"$(PROJECT_TEMP_DIR)/../UninstalledProducts/include"
由于我们将静态库配置为使用“跳过安装”,因此编译后的文件将移至临时构建目录中的“UninstalledProjects”文件夹。 我们的路径也解析为我们为静态库设置的“include”文件夹,并用于我们的用户头搜索路径。 两者合作让Xcode在编译过程中知道在哪里找到我们的库。 由于Debug和Release配置都存在此临时构建目录,因此您只需Xcode的单个路径即可搜索静态库。
Xcode 4 Project无法编译静态库
相关问题:Xcode 4中的“词法或预处理器问题文件未找到”
错误可能包括; 缺少头文件,“词法或预处理器问题”
解决方案:
上一篇: Xcode 4 can't locate public header files from static library dependency