C++中自动化依赖管理的最清晰方式是什么?

3

相关问题:C++构建系统-使用什么?

我正在寻找一个适用于我的C++项目的好的构建/依赖管理工具,具备以下期望功能:

  • 能够通过名称、版本指定依赖关系
  • 在编译我的应用程序时,自动包含依赖项的“include”目录
  • 依赖项会自动下载、构建并链接到我的应用程序
  • 传递性依赖也具有上述两个行为
  • 能够指定测试范围的依赖关系
  • 测试会自动构建和运行,可能会使用内存泄漏检查工具(例如valgrind)
  • 可能运行覆盖率工具,例如gcov
  • 跨平台支持
我曾经使用过Maven,结合[nar-maven-plugin]和有时候的[cmake-maven plugin]。然而,这意味着我必须为每个依赖项制作一个[pom.xml]。这种方法并不是特别好,因为有时需要编写一个[很烦琐的pom.xml]才能让事情正常工作。此外,它不支持运行valgrind(尚未内置支持)。
我曾尝试使用CMake,因为我看到很多项目都在使用它,但我发现很多时间都花在了“编写构建/依赖管理系统”上,而不是“使用它”。是的,我可以编写许多函数,如下所示:
function(RequireSomeLib artifact)
  # ExternalProject_Add(SomeLib ... etc.)
  # find SomeLib package
  # add include dirs(artifact SomeLib_INCLUDE_DIRS)
  # if SomeLib is not just a header library, also link its built library to the artifact
  # for each of SomeLib's dependencies, do this same "call" (transitive dependencies' libraries must also be linked when building an executable)
endfunction()

对于每个依赖项都需要这样做。虽然繁琐,但目前我认为这是最干净的方法。

在假设 CMake被用于我项目所依赖的库 的前提下,有没有更好的解决这个问题的方法?

我还没有看到或尝试过SCons,AutoTools或QMake(但我会尝试的)。

在Java中,“检索依赖项,构建,测试和发布”问题要简单得多。._

1个回答

2
所有的C++构建系统都需要你编写依赖和包检测。每一个构建系统都是由于对之前技术的不满而创建的,旨在消除样板代码的需求,并创建一个完整的、跨平台的、自动化的、易于使用的解决方案,但最终你仍然需要编写代码来构建你的软件包。
如果你足够努力,你会发现支持每个构建系统的倡导者之间的争论。几年前我就发现了这样的一个争论。他们的论点很弱,以至于我最终放弃了搜索。
我选择使用CMake的一个简单原因是:几年前它是我能找到的第一个允许我生成不同构建目录的构建系统。我相信所有现代构建系统已经实现了这个想法,但我仍然坚持使用CMake,只是因为我习惯了它。老实说,我在裸露的Makefile上没有找到什么明显的优势。即使是一个没有依赖关系的C++项目,我也必须编写CMakeFiles.txt的样板代码。
后来我决定尝试一些不同的IDE;我很幸运Qt Creator可以运行在CMake项目上;这是我留在CMake的另一个原因。
我的建议是去访问每个构建系统的网页;查看它们当前实现的功能(而不是TODO),与其他系统的比较,IDE支持以及你必须为它们编写的代码的复杂性。我相信你不会找到一个满足你所有要求的构建系统,所以你必须彻底测试它们,看看哪个最适合你。

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