2

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

4

1 回答 1

0

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

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

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

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

请查看以下示例

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

于 2021-04-20T17:26:47.577 回答