【问题标题】:Build System with Recursive Dependency Aggregation使用递归依赖聚合构建系统
【发布时间】:2010-05-17 03:34:12
【问题描述】:

我最近开始使用跨平台构建系统(按需生成 make 文件、Visual Studio 解决方案/项目等)建立自己的库和项目,但我遇到了一个可能已经解决的问题。

我遇到的问题是:当一个应用程序的依赖项也有依赖项时,被链接的应用程序必须链接该依赖项及其所有子依赖项。这以递归方式进行,例如

(为了论证,假设我们只处理静态库。)

  • TopLevelApp.exe
    • 依赖关系_A
      • dependency_A-1
      • dependency_A-2
    • 依赖_B
      • dependency_B-1
      • dependency_B-2

所以在这个例子中,TopLevelApp 将需要链接dependency_A、dependency_A-1、dependency_A-2 等,B 也是如此。我认为在目标应用程序中手动记住所有这些的责任是非常次优的。还有一个问题是确保所有目标都使用相同版本的依赖项(假设某些目标依赖于相同的东西,例如 boost)。

现在需要链接所有库,并且无法绕过它。我正在寻找的是一个为你管理这个的构建系统。因此,您所要做的就是指定您依赖某些东西,并且该库的适当依赖项将被自动拉入。

我一直在查看的构建系统是 premake premake4,它不能处理这个问题(据我所知)。有谁知道可以处理此问题的构建系统?如果没有,那为什么不呢?

【问题讨论】:

  • 看来 cmake 可以完成所需的工作,有人知道其他人吗? Scons,汽车制造商?
  • 你可以通过 pkg-config 使用 automake 来实现它。
  • 谢谢迈克尔,我想这就是我需要的所有信息。看起来我将把我的构建工作转移到 cmake :)
  • 在对 cmake 失望之后,我回到了 premake,我发现有一个补丁可以支持这个特定的功能!我已经检查了源代码并验证了它可以正常工作,而且它实际上很直观且易于使用:) 我将尽我所能帮助确保此功能在下一个官方版本的 premake 中(我强烈推荐)。
  • 自从我问这个问题以来已经有一段时间了,事实证明我在之前的评论中提到的 premake 中的功能不能按预期工作。具体来说,它没有正确排序要链接的东西……还有其他问题,但我忘记了细节,我建议避免使用此功能。作为最后的手段,我实际上已经编写了自己的构建系统。

标签: c++ dependencies build-system premake


【解决方案1】:

处理这种情况的典型方法是让您依赖的库告诉您它需要什么以及它链接到的版本。一种方法是通过pkg-config。例如,如果您调用 pkg-config name_of_package --cflags,它将打印出必要的标志,其中应包括添加间接依赖项的标头所需的标志。同样, pkg-config name_of_package --ldflags 将打印包括该特定库及其依赖项的必要链接器标志。至于构建系统,我的建议是使用CMake。在 CMake 中,通过调用 FIND_PACKAGE(name_of_package) 来找到依赖关系,如果找到包,它又将变量 name_of_package_FOUND 定义为 1,并且 - 如果找到 - 将 name_of_package_LIBRARIES 和 name_of_package_INCLUDE_DIRS 定义到库和头路径对于该包以及其依赖项的库和标头。也就是说,FIND_PACKAGE 机制通过第三方编写的可插入模块工作,因此虽然系统应该设置 _LIBRARIES 和 _INCLUDE_DIRS 变量,以便递归地包含依赖项的依赖关系,但并非所有模块都正确执行此操作我上次检查。

【讨论】:

    猜你喜欢
    • 2021-08-18
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多