【问题标题】:Xcode dependencies across different build directories?跨不同构建目录的 Xcode 依赖项?
【发布时间】:2012-05-30 23:32:52
【问题描述】:

我正在尝试为包含多个可执行文件和静态库的项目设置 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 并再次构建它。可执行文件不会重新链接(它应该)。非常感谢您对此提供的任何帮助。

【问题讨论】:

    标签: xcode dependencies


    【解决方案1】:

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

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

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

    对于依赖库,添加一个“复制文件构建阶段”,以绝对路径为目标,路径文本字段应为 DEPENDENT 目标所在的目录。然后点击 Products,找到依赖库(以 .a 结尾),并将其拖入“Copy Files Build Phase”。如果您现在构建,这将像以前一样将库放入其自己的目录中,然后还将其复制到依赖项的目标目录中。

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

    当然,负面因素是复制的额外时间,以及(在复制阶段)为您的库的每个依赖项指定目标目录的必要性。虽然比其他选择更胜一筹......

    【讨论】:

      【解决方案2】:

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

      项目 > 编辑目标设置、常规选项卡、+ 按钮,添加作为构建选定目标的先决条件的任何目标。这应该会让你重新开始。

      【讨论】:

      • 如前所述,我已经设置了依赖项,只要所有目标都构建到同一个目录,项目就会成功构建。当我将不同的目标构建到不同的目录时,依赖项会失败。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

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

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

        祝你好运!

        【讨论】:

          【解决方案5】:

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

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

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

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

          【讨论】:

          • 我在share.industriousone.com/XcodeDepsIssue.zip 发布了一个示例项目来演示这个问题。非常感谢您提供任何见解。
          • 在您的 App 目标中,将所有配置的库搜索路径更改为 $(inherited) $(SYMROOT)/../lib/$(CONFIGURATION),这样应该可以工作。
          • 感谢您的回答,但没有任何改变。该应用程序可以很好地找到库和链接。库会根据更改重新构建,但应用永远不会重新链接。
          猜你喜欢
          • 2013-01-30
          • 2017-05-24
          • 2011-05-12
          • 1970-01-01
          • 2012-07-30
          • 1970-01-01
          • 1970-01-01
          • 2011-03-20
          • 1970-01-01
          相关资源
          最近更新 更多