不同构建目录中的Xcode依赖关系?

时间:2009-09-21 20:56:10

标签: xcode dependencies

我正在尝试为包含多个可执行文件和静态库的项目设置Xcode。我创建了多个目标并设置了链接和依赖关系,最初一切都很好。抓住......

这是一个已经有Visual Studio和Makefile构建的现有项目。这些构建将库放在 lib / Debug 目录中,将可执行文件放在 bin / Debug 中。因此,在Xcode中,我将Build Products Path分别更改为“lib”和“bin”(因此我们可以为所有平台使用一套文档)。这会将编译后的目标放在正确的位置,但会完全中断链接(未找到库)和依赖项。

我可以通过将 $(SRCROOT)/ lib / Debug 添加到每个可执行文件的库搜索路径来修复链接(但感觉Xcode应该能够自己解决这个问题,这让我觉得我做错了什么。)

但是 - 我无法弄清楚如何让依赖项再次运行。如果我更改库源文件,库将重建但不依赖于可执行文件。如果我强制构建可执行的Xcode,则返回成功而不做任何事情;它认为目标是最新的。如果我清理目标然后重建它就可以了。

那么,这里有什么想法吗? Xcode在这方面是不是很愚蠢,还是我(我倾向于后者)?

更新:我发布了一个示例项目,以便在http://share.industriousone.com/XcodeDepsIssue.zip上展示该问题。构建一次,然后修改MyStaticLib.c并再次构建它。可执行文件不会重新链接(它应该)。非常感谢您对此提供任何帮助。

5 个答案:

答案 0 :(得分:2)

starkos,谢谢你发表你的结论。它验证了我的经验。这种情况真的搞砸了我,所以很高兴知道我不仅仅是错过了什么。

然而,我确实发现了一种解决方法,可以避免创建多个项目或将库及其依赖项保存在同一目录中。这是一个黑客,但它确实在这里工作。

我知道这有点晚了,但总比没有好。

对于依赖库,添加“复制文件构建阶段”,使用绝对路径作为目标,路径文本字段应该是DEPENDENT目标所在的目录。然后单击Products,找到依赖库(将以.a结尾),并将其拖到“复制文件构建阶段”。如果你现在构建,这将把库放到它自己的目录中,然后将它复制到依赖的目标目录中。

对于依赖项,您现在可以从库搜索路径中删除依赖项的输出目录。这将导致它找到库副本。如果这样做,每次重新链接依赖项.a时,依赖项确实会重新链接。

负面因素当然是复制的额外时间,以及为库的每个依赖项指定(在复制阶段)目标目录的必要性。尽管......打败了替代品......

答案 1 :(得分:1)

Xcode不会根据构建产品的使用自动设置依赖关系;您必须自己设置显式目标依赖项。

项目>编辑目标设置,常规选项卡,+按钮,添加作为构建所选目标的先决条件的任何目标。这应该让你再次前进。

答案 2 :(得分:1)

我已经对此进行了一些研究,答案是否定的,Xcode 3.x不会跟踪生活在不同目录中的目标之间的依赖关系。您可以通过为每个库提供自己的项目并将其中的每一个添加到主项目来解决它。或者您可以将所有目标保存在一个目录中。选择你的毒药。

答案 3 :(得分:1)

这是我在xcode 4.3.1中针对这种奇怪行为的解决方案。您必须在scheme中添加构建预执行:

rm -f ${BUILT_PRODUCTS_DIR}/${EXECUTABLE_PATH}

并选择要用于此脚本的构建设置。每次构建之前,目标可执行文件都将被删除并完全重建。它对我有帮助,我希望它对你有帮助。

注意:尝试将此脚本置于项目构建阶段,结果为否定 - 调试器无法连接进程以开始调试。

祝你好运!

答案 4 :(得分:0)

好吧,让Linking ...构建行失败的文本会有所帮助。但有几点:

1)你不应该链接到$(SRCROOT)中的任何内容。那是你的项目来源。找到要链接的东西的两个地方是$(SYMROOT)(Build Products目录)或$(DSTROOT)(Installed Products目录)。

您可以做的一件事是拥有一个通用的Build Directory,然后使用'xcodebuild install'操作在Installation Directory中安装产品。另一种是使用复制文件构建阶段在构建之后复制它们,因此您可以在$(SYMROOT)中链接它们,但仍然可以将它们放在Windows同胞期望的位置。

这可能是正确设置每个目标构建产品目录的一种方法,但我真的必须看到项目本身来解决它。