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

4
我正在为一个包含多个可执行文件和静态库的项目设置Xcode。我创建了多个目标,并设置了链接和依赖项,最初一切正常。但是问题出现了...
这是一个已经具有Visual Studio和Makefile构建的现有项目。这些构建将库放在“lib/Debug”目录中,将可执行文件放在“bin/Debug”目录中。因此,在Xcode中,我将编译产品路径分别更改为“lib”和“bin”(以便我们可以为所有平台使用一组文档)。这将编译后的目标放在正确的位置,但完全破坏了链接(找不到库)和依赖项。
对于每个可执行文件,我可以通过将“$(SRCROOT)/lib/Debug”添加到“Library Search Paths”来修复链接问题(但感觉Xcode应该能够自己解决这个问题,这让我认为我做错了什么)。
但是——我无法弄清楚如何再次使依赖项起作用。如果我更改库源文件,则库将重新构建,但相关的可执行文件却没有。如果我强制构建可执行文件,Xcode会返回成功而不执行任何操作;它认为目标是最新的。如果我清除目标,然后重建它,它就可以工作了。
那么,这里有什么想法吗?Xcode在这方面是否太过愚蠢,还是我做错了(我倾向于后者)?
更新:我在http://share.industriousone.com/XcodeDepsIssue.zip上发布了一个演示此问题的样本项目。构建一次,然后修改MyStaticLib.c并再次构建它。可执行文件将不会重新链接(但实际上应该)。非常感谢您在这件事情上提供帮助。
5个回答

2

starkos,感谢您发布结论。 这也验证了我的经验。这种情况真的让我感到困扰,所以知道我没有错过什么很好。

然而,我发现了一个解决方法,可以避免创建多个项目或将库及其依赖项保留在同一目录中。这是一个hack方法,但它确实有效。

虽然有点晚,但总比没有好。

对于依赖库,请添加“复制文件构建阶段”,将绝对路径设置为目标,并将路径文本字段设置为DEPENDENT目标所在的目录。然后单击“产品”,找到依赖库(将以.a结尾),将其拖入“复制文件构建阶段”。如果现在进行构建,则会将库放入其自己的目录中,就像之前一样,然后将其复制到依赖目标的目录中。

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

当然,负面影响是需要花费额外时间进行复制,并且必须指定(在复制阶段中)库的每个依赖项的目标目录。但这仍然比其他替代方案要好得多....


1

这是我针对xcode 4.3.1中的这种怪异行为提出的解决方案。您需要在方案中添加构建前操作:

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

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

注意:尝试将此脚本放入项目构建阶段,结果是负面的 - 调试器无法连接进程以开始调试。

祝你好运!


1

我进一步研究了这个问题,答案是否定的,Xcode 3.x不能跟踪不同目录下的目标之间的依赖关系。你可以通过为每个库创建一个单独的项目,并将它们添加到主项目中来解决这个问题。或者你可以将所有目标放在一个目录中。选择你的解决方案吧。


1

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

项目 > 编辑目标设置,常规选项卡,+按钮,添加任何作为构建所选目标的先决条件的目标。这样应该可以让您重新开始工作。


正如我所提到的,我已经设置好了所有依赖项,并且只要所有目标都构建到同一个目录中,该项目就可以成功构建。但是当我将不同的目标构建到不同的目录时,依赖项会失败。 - J. Perkins

0

好的,如果能提供出现问题的链接构建行的文本将会有所帮助。但是有几点需要注意:

1)你不应该链接到$(SRCROOT)中的任何内容。那是你的项目源代码。可以链接的两个地方是$(SYMROOT)(构建产品目录)或$(DSTROOT)(安装产品目录)。

你可以做的一件事是拥有一个共同的构建目录,然后使用“xcodebuild install”操作将产品安装在安装目录中。另一种方法是使用复制文件构建阶段在构建后将它们复制过去,这样你就可以在$(SYMROOT)中链接它们,但仍然让你的Windows同事可以找到它们。

可能有一种方法可以正确设置每个目标的构建产品目录,但我真的需要看到项目本身才能弄清楚。


我已经发布了一个示例项目,位于http://share.industriousone.com/XcodeDepsIssue.zip,以演示该问题。非常感谢您的任何见解。 - J. Perkins
在您的应用程序目标中,将所有配置的库搜索路径更改为$(inherited) $(SYMROOT)/../lib/$(CONFIGURATION),然后应该可以正常工作。 - cdespinosa
谢谢您的回答,但是没有改变。应用程序可以很好地找到库并链接。库在更改时重新构建,但应用程序从未重新链接。 - J. Perkins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接