代码之家  ›  专栏  ›  技术社区  ›  J. Perkins

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

  •  4
  • J. Perkins  · 技术社区  · 16 年前

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

    这是一个现有的项目,它已经有了Visual Studio和Makefile版本。那些建筑把图书馆放在 LIB/调试 目录和中的可执行文件 bin/调试 . 因此,在Xcode中,我将构建产品路径分别更改为“lib”和“bin”(因此我们可以为所有平台使用一组文档)。这会将已编译的目标放在正确的位置,但会完全破坏链接(未找到库)和依赖项。

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

    但我不知道如何让依赖关系重新工作。如果我更改库源文件,库将重新生成,但不重建依赖的可执行文件。如果我强制构建可执行Xcode,它会在不做任何事情的情况下返回成功;它认为目标是最新的。如果我清理目标,然后重建它。

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

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

    5 回复  |  直到 14 年前
        1
  •  2
  •   RedRedSuit    15 年前

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

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

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

    对于依赖库,添加一个“复制文件构建阶段”,以绝对路径为目标,路径文本字段应该是依赖目标所在的目录。然后单击产品,找到依赖库(将以.a结尾),并将其拖到“复制文件生成阶段”。如果现在正在生成,这将像以前一样将库放在自己的目录中,然后将其复制到依赖项的目标目录中。

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

    当然,这些底片是拷贝所需的额外时间,并且需要(在拷贝阶段)为您的库的每个依赖项指定目标目录。尽管如此,它还是击败了其他选择……

        2
  •  1
  •   cdespinosa Martin Cote    16 年前

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

    Project>编辑目标设置,常规选项卡,+按钮,添加构成生成所选目标的前提条件的任何目标。这应该能让你重新振作起来。

        3
  •  1
  •   J. Perkins    16 年前

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

        4
  •  1
  •   Orange    14 年前

    下面是Xcode4.3.1中这种奇怪行为的解决方案。您必须在方案中添加生成预操作:

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

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

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

    祝你好运!

        5
  •  0
  •   cdespinosa Martin Cote    16 年前

    好吧,让链接的文本…建立失败的生产线。但有两件事:

    1)您不应该链接到$(srcroot)中的任何内容。这是你的项目来源。找到要链接的内容的两个地方是$(symroot)(构建产品目录)或$(dstroot)(已安装产品目录)。

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

    可能有一种方法可以正确地设置每个目标构建产品目录,但是我真的需要看到项目本身来解决这个问题。