2009-09-21 95 views
4

我想为包含多个可执行文件和静态库的项目设置Xcode。我创建了多个目标并设置了链接和依赖关系,并且最初一切都很好。赶上...跨不同编译目录的Xcode依赖关系?

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

我可以通过添加$(SRCROOT)/ lib中/调试到库搜索路径为每个可执行文件(但感觉像Xcode中应该能算出这个对自己,这让我觉得解决这个链接我做错了什么)。

但我无法弄清楚如何让依赖重新工作。如果我更改库源文件,库将重建但不包含相关的可执行文件。如果我强制构建可执行文件Xcode返回成功而不做任何事情;它认为目标是最新的。如果我清理目标,然后重建它的作品。

那么,这里有什么想法? Xcode在这方面基本上是愚蠢的,还是我(我倾向于后者)?

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

回答

1

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

+1

Xcode 4的这个改变了吗? – 2012-01-19 23:06:58

1

Xcode不会自动设置基于使用构建产品的依赖关系;你必须自己设置显式的目标依赖关系。

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

+0

正如我所提到的,我已经建立了依赖关系,只要所有目标都构建到同一个目录,项目就会成功建立。当我为不同的目录建立不同的目标时,依赖关系失败。 – starkos 2009-09-22 12:35:57

0

好的,这将有助于让Linking ...构建线的文本失败。但有几件事:

1)你不应该链接到任何$(SRCROOT)。那是你的项目资源。找到要链接的东西的两个地方是$(SYMROOT)(Build产品目录)或$(DSTROOT)(安装产品目录)。

你可以做的一件事是建立一个通用的生成目录,然后使用'xcodebuild install'动作在安装目录中安装产品。另一种方法是在构建之后使用“复制文件”构建阶段来复制它们,以便您可以在$(SYMROOT)中与它们链接,但仍然可以将它们放在Windows同胞期望的位置。

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

+0

我已经在http://share.industriousone.com/XcodeDepsIssue.zip上发布了一个示例项目来演示这个问题。非常感谢任何见解。 – starkos 2009-09-22 18:30:40

+0

在您的App目标中,将所有配置的库搜索路径更改为$(继承)$(SYMROOT)/../ lib/$(CONFIGURATION),并且应该可以工作。 – cdespinosa 2009-09-22 22:36:59

+0

感谢您的答复,但没有变化。该应用程序可以找到库和链接就好了。该库在更改时重建,但应用程序不会重新链接。 – starkos 2009-09-23 12:23:09

2

starkos,感谢您发表您的结论。它也验证了我的经验。这种情况真的把我搞砸了,所以很高兴知道我不是错过了一些东西。

但是我没有发现,避免创建多个项目或保持库及其相关联在同一目录下的解决方法。这是一个黑客攻击,但它确实在这里工作。

我知道这有点晚,但比从未好。

对于依赖库,添加“复制文件构建阶段”,以绝对路径作为目标和路径文本字段应该是在从属目标生活的目录。然后点击产品,找到依赖关系库(将以.a结尾),并将其拖入“复制文件构建阶段”。如果您现在构建,则会像以前一样将库放入其自己的目录中,然后将其复制到依赖项的目标目录中。

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

不利的一面在于,当然,对于副本的额外的时间,以及有必要指定(在复制阶段)为每个依赖库的目标目录。击败了地狱,虽然替代品....

1

这里是我在Xcode 4.3.1这种怪异的行为的解决方案。你必须在方案中添加预生成的行动:

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

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

注:试图把这个脚本在项目建设阶段,结果为阴性 - 调试器无法连接过程开始调试。

祝你好运!