c++ - 在 C++ 中自动依赖管理的最干净的方法

标签 c++ dependency-management build-system

<分区>

相关问题:C++ Build Systems - What to use?

我正在努力为我的 C++ 项目寻找一个不错的构建/依赖管理工具,它具有以下所需的功能:

  • 能够通过名称、版本指定依赖
  • 依赖项的“include”目录在我的应用程序编译期间自动包含在内
  • 依赖项会自动下载、构建并链接到我的应用程序
  • 传递依赖也有以上两种行为
  • 指定测试范围依赖性的能力
  • 测试是自动构建和运行的,可能会使用内存泄漏检查工具(例如 valgrind)
  • 可能运行覆盖工具,例如gcov
  • 支持跨平台

我使用过 Maven,带有 [nar-maven-plugin] ,有时是 [cmake-maven plugin] .但是,这意味着我必须制作一个 [pom.xml per dependency] .这种方法不是特别好,有时,[nasty 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 中,“检索依赖项、构建、测试和发布”问题要简单得多._。

最佳答案

所有 C++ 构建系统都需要您编写依赖项和包检测代码。它们中的每一个都是出于对以前技术的失望而创建的,其目的是消除对样板代码的需求,并创建一个完整的、跨平台的、自动化的、易于使用的解决方案,但最终,除了要构建的包的代码之外,您最终还将编写代码。

如果仔细观察,您会发现每个构建系统的拥护者之间存在争论。几年前我找到了其中一个。他们的论点太无力了,我最终放弃了搜索。

我是 CMake 的用户,原因很简单:它是几年前我能找到的第一个允许我生成不同构建目录的工具。我确信所有现代构建系统都已经实现了这个想法,但我坚持使用 CMake 只是因为我已经习惯了它。老实说,我发现与基本的 Makefile 相比,几乎没有明显的优势。我不得不为我的 CMakeFiles.txt 编写样板代码,即使它是一个没有依赖项的 C++ 项目。

一段时间后,我决定尝试一些不同的 IDE;我有幸在 CMake 项目上运行 Qt Creator;我留在 CMake 的另一个原因。

我的建议是访问每个构建系统的网页;查看它们当前实现的功能(不是 TODO)、与其他系统的比较、IDE 支持以及您必须为它们编写的代码的复杂性。我很确定您不会找到满足您所有要求的构建系统,因此您必须对它们进行彻底测试,看看哪一个最适合您。

关于c++ - 在 C++ 中自动依赖管理的最干净的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26520917/

相关文章:

build - 有 CMake 递归扫描文件夹吗?

c++ - clEnqueueNDRangeKernel 阻塞执行

migration - 什么是 Boost Jam? Jam 值得迁移到吗?

c++ - 在 C++ 中使用私有(private)方法的属性

spring 依赖管理 gradle 插件不下载依赖

java - Maven 依赖范围。如何理解在哪里可以使用这种依赖?

grails - Grails GGTS-刷新依赖项失败

dart - 如何重新启动文件更改的 dart 服务器?

c++ - 多态命令解析器设计

c++ - C++ 中的 char 数组和指向 char 的指针