如何以跨平台的方式自动下载C ++依赖项+ CMake?

基本上我想实现这个工作stream程:

  1. 从Windows系统(或任何平台)检索存储库。

  2. 运行一些获得依赖关系的工具,包括include和libs,并将它们放在适当的位置(如在Windows上的\ Program Files \ Microsoft Visual Studio 10.0 \ VC \ Lib和\ Includes)

  3. 运行CMake(创buildMSVS项目)

  4. 打开MSVS项目并编译它。

我想在大多数平台上有这个工作stream程。

我不想手动下载依赖关系

如何做到这一点,而不需要在版本库中存储依赖 达到这个目标的最好方法是什么?

在CMake中,您可以使用file(DOWNLOAD URL PATH) 下载文件 ,将其与自定义命令结合使用来下载和解压:

 set(MY_URL "http://...") set(MY_DOWNLOAD_PATH "path/to/download/to") set(MY_EXTRACTED_FILE "path/to/extracted/file") if (NOT EXISTS "${MY_DOWNLOAD_PATH}") file(DOWNLOAD "${MY_URL}" "${MY_DOWNLOAD_PATH}") endif() add_custom_command( OUTPUT "${MY_EXTRACTED_FILE}" COMMAND command to unpack DEPENDS "${MY_DOWNLOAD_PATH}") 

你的目标应该取决于自定义命令的输出,然后当你运行CMake时,文件将被下载,当你建立,提取和使用。

这可以全部包装在一个宏中,使其更易于使用。

你也可以看看使用CMake模块ExternalProject ,它可以做你想做的事情。

Hunter是一个基于CMake 3的依赖管理系统。 它工作得很好,但是还没有很多软件包。 如果你需要的软件包还不是系统的一部分,那么可以简单地添加它们,假设它们也是基于CMake的。

实现这个最好的方法是消除你的依赖。

依赖是邪恶的。

消除他们,而不是依赖于他们。

认真地

实现这个最好的方法是消除你的依赖。

依赖是邪恶的。

消除他们,而不是依赖于他们。

认真。

你不想手动下载它们,你不想将它们存储在你的仓库中,你的客户端不想为你下载它们。 事实上,你的编译器甚至不想编译它们。

喜欢切换到Java来添加一个C库依赖…

与此同时,检查CMake的ExternalProject模块的建议是最接近你将要通过一个基于CMake的构建随时获得非存储库存储的自动依赖关系 – 下载 – 配置 – 构建 – 安装的。