Xcode搜索依赖项中公共标头的路径

Kru*_*lur 11 xcode objective-c dependency-management

我正在尝试清理我的一些项目,其中一个令我困惑的事情是如何处理我添加为"项目依赖项"的静态库中的头文件(通过添加项目文件本身).基本结构是这样的:


MyProject.xcodeproj
  Contrib
    thirdPartyLibrary.xcodeproj
  Classes
    MyClass1.h
    MyClass1.m
    ...
Run Code Online (Sandbox Code Playgroud)

现在,依赖项都已正确设置和构建,但是如何为"thirdPartyLibrary.xcodeproj"指定公共标题,以便它们在构建MyProject.xcodeproj时位于搜索路径上.现在,我已经在thirdPartyLibrary.xcodeproj中对include目录进行了硬编码,但显然这是笨拙且不可移植的.我假设,因为标题是公共的并且已经构建到〜/ Library中的某个临时位置(.a文件也在这里),所以有一种简洁的方法来引用这个目录.只..怎么样?一小时的谷歌搜索空白,所以任何帮助都非常感谢!

Cas*_*ser 5

如果我理解正确,我相信您想要将包含 $(BUILT_PRODUCTS_DIR) 的路径添加到项目构建设置中的 HEADER_SEARCH_PATHS 中。

作为示例,我采用了一个包含静态库的现有 iOS 项目,该静态库仅按照您描述的方式包含,并将库头文件设置为公共。我还注意到,该项目的 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
Run Code Online (Sandbox Code Playgroud)

您的情况可能略有不同,但您寻找的确切路径可能可以在Xcode 的构建设置中找到。此外,您可能会发现将运行脚本构建阶段添加到目标并在构建时记下各种设置的值很有帮助,例如:

echo "BUILT_PRODUCTS_DIR " $BUILT_PRODUCTS_DIR
echo "HEADER_SEARCH_PATHS " $HEADER_SEARCH_PATHS
echo "PUBLIC_HEADERS_FOLDER_PATH " $PUBLIC_HEADERS_FOLDER_PATH
.
.
.
etc.
Run Code Online (Sandbox Code Playgroud)


Dam*_*llo 1

我认为你的解决方案是足够的并且是普遍接受的。一种替代方法是将所有头文件都放在一个伞目录下,该目录可以描述使用依赖库的接口并将其放入包含路径中。我认为这与 /usr/include 类似。我从未亲自尝试过但我认为可行的另一种选择是创建对MyProjectThirdPartyLibrary的所有标头的引用,以便它们看起来是MyProject的成员。您可以通过将它们从某个位置拖到MyProject中,然后取消选择将它们复制到项目顶级目录中的复选框来完成此操作。从一个角度来看,这对我来说似乎是可行的,因为就好像您明确声明您的项目依赖于这些特定的类,但它并不直接负责编译它们。

解决此问题时需要注意的一件事是依赖于 Xcode 的实现特定细节来自动定位库。这样做可能看起来无害,但它用于构建项目的工作流程可能会随着更新而改变,并且可能会以微妙和令人困惑的方式破坏您的项目。如果它们在某些文档中没有明确定义,那么当您可以通过其他方式强制执行所需的行为时,我会将任何效果视为巧合,并且不值得在您的项目中利用。最后,您可能必须定义一个您遵循的约定,或者找到一个您从其他人那里采用的约定。通过这样做,您可以放心,如果您的解决方案已记录并且可重现,则任何开发人员(包括将来的您自己)都可以拿起它并继续操作,而不会被它绊倒,并且它将经受时间的考验。

  • 感谢您的详细回答。我仍然认为令人困惑的是,从依赖项导出的公共标头没有放在包含路径上,并且不可能为 iOS 创建(静态)框架项目。但一个人能做什么呢?我仍然希望有更好的方法...... (2认同)