我正在尝试清理我的一些项目,其中一个令我困惑的事情是如何处理我添加为“项目依赖项”的静态库中的头文件(通过添加项目文件本身) 。基本结构是这样的:
MyProject.xcodeproj
Contrib
thirdPartyLibrary.xcodeproj
Classes
MyClass1.h
MyClass1.m
...
现在,依赖项都已正确设置和构建,但是如何为“thirdPartyLibrary.xcodeproj”指定公共标题,以便在构建MyProject.xcodeproj时它们位于搜索路径上。现在,我已经在thirdPartyLibrary.xcodeproj中对include目录进行了硬编码,但显然这是笨拙且不可移植的。我假设,因为标题是公共的并且已经构建到〜/ Library中的某个临时位置(.a文件也在这里),所以有一种简洁的方法来引用这个目录。只..怎么样?一小时的谷歌搜索空白,所以任何帮助都非常感谢!
答案 0 :(得分:3)
如果我理解正确,我相信您想在项目构建设置中向HEADER_SEARCH_PATHS添加包含$(BUILT_PRODUCTS_DIR)的路径。
作为一个例子,我采用了一个现有的iOS项目,其中包含一个静态库,它以您描述的方式包含在内,并将库头文件设置为public。我还注意到该项目的PUBLIC_HEADERS_FOLDER_PATH设置为" / usr / local / include"当父项目构建依赖项目时,这些文件将复制到$(BUILT_PRODUCTS_DIR)/ usr / local / include。因此,解决方案是在项目的构建设置中将$(BUILT_PRODUCTS_DIR)/ usr / local / include添加到HEADER_SEARCH_PATHS。
HEADER_SEARCH_PATHS = $(BUILT_PRODUCTS_DIR)/usr/local/include
您的情况可能略有不同,但您可能会在Xcode's build settings找到您寻找的确切路径。此外,您可能会发现将Run Script构建阶段添加到目标并在构建时记下各种设置的值有所帮助,例如:
echo "BUILT_PRODUCTS_DIR " $BUILT_PRODUCTS_DIR
echo "HEADER_SEARCH_PATHS " $HEADER_SEARCH_PATHS
echo "PUBLIC_HEADERS_FOLDER_PATH " $PUBLIC_HEADERS_FOLDER_PATH
.
.
.
etc.
答案 1 :(得分:1)
我认为您的解决方案已经足够并且是普遍接受的解决方案。一种替代方法是将所有头文件放在一个伞形目录下,该目录可以描述使用依赖库的接口并将其放在包含路径中。我认为这与/ usr / include类似。另一个我从未尝试过的替代方案,但我认为可以从 MyProject 创建 thirdPartyLibrary 的所有标题的引用,以便它们看起来像是 MyProject的。您可以通过将它们从某个位置拖到 MyProject 中,然后取消选中将其复制到项目顶级目录中的复选框来完成此操作。从一个角度来看,这对我来说似乎是可行的,因为就好像你明确声明你的项目依赖于那些特定的类,但它并不直接负责编译它们。
解决此问题时需要注意的一件事情取决于Xcode的实现特定细节,以便自动定位库。在此期间这样做可能看起来无害,但它用于构建项目的工作流程随着更新而变化,并且可能以微妙和混乱的方式破坏您的项目。如果它们在某些文档中没有明确定义,那么当你可以通过其他方式强制执行所需的行为时,我会采取任何后果,并且不值得在项目中利用。最后,您可能必须定义一个您遵循的约定或找到您从其他人那里采用的约定。通过这样做,您可以放心,如果您的解决方案具有文档记录和可重现性,那么任何开发人员(包括将来自己)都可以在不绊倒它的情况下继续进行解决,并且它将经得起时间的考验。
答案 2 :(得分:0)
我们这样做的方法是进入主项目的构建目标设置并添加:
User Header Search Path = "Contrib"
并检查它是否递归搜索。即使有许多(在某些项目中为10-15个)依赖项,我们也没有看到递归搜索的性能问题。