在 CMake 中使用“git submodules”和“ExternalProject_Add”进行依赖管理之间有什么关系?

Cia*_*lsh 5 c++ git cmake git-submodules external-project

最近,我花了很多时间关注一位早已去世的开发人员为我正在开发的 C++ 项目提供的含糊且不正确的构建说明。因此,我正在编写一个新的构建系统,并且正在寻找最好的方法。我已经决定ExternalProject_Add在项目目标之前使用 CMake 中的命令来收集和构建依赖项,但我还发现了一篇建议使用 git 子模块的优秀文章,它看起来做了非常相似的事情,即使不是相同的事情。所以我的问题: git 子模块ExternalProject_Add之间有什么关系?

puc*_*chu 1

您可以ExternalProject_Add在没有 git 子模块的情况下使用:

if (SPECIAL_CASE)
  include (ExternalProject)
  ExternalProject_Add (
    project1
    PREFIX project1
    GIT_REPOSITORY "https://github.com/project.git"
    GIT_TAG "v1"
  )
endif ()
Run Code Online (Sandbox Code Playgroud)

project在主项目构建之前将被克隆到CURRENT_BINARY_DIR、构建并安装到本地系统中。您的主要项目将从全球范围内使用#include <project/header.h>。该解决方案仅适用于流行项目,这些项目可作为部分目标操作系统的依赖项。您可以保证您的目标系统将收到所需版本的依赖项。

例如,让我们看看openssl,您的本地系统 100% 安装了这个库。您的目标操作系统列表包括本机Win32(不带MinGWCygWin)。openssl所有可用的for版本Win32都太旧了,您将无法找到所需版本的openssl安装程序Win32。所以你可以#include <openssl/ssl.h>if (WIN32) ExternalProject_Add没有子模块一起使用。将子模块添加到您的项目中是没有意义的openssl

请查看以下示例

如果外部project不流行,在流行的包管理器(如 rpm、deb、ebuilds 等)中不可用,那么最好使用子模块。