CMake:外部项目的依赖关系

jgs*_*ogo 5 c++ cmake dependency-management

我想知道如何管理外部项目的依赖项.假设我有三个项目,每个项目位于不同的存储库中:

  1. 核心:图书馆出口了许多有用的东西.
  2. Lib1:具有一些特定类的库(取决于Core).
  3. 可执行文件:使用来自Core和Lib1的东西.

每个项目都有其CMakeLists.txt.使用find_package并在CMake上定义路径我可以毫无问题地构建每个项目并安装它(我按照这个tuto来构建库的.cmake文件)


现在我正在尝试使这个过程尽可能简单,我正在介绍ExternalProject_Add宏,这样人们只需克隆可执行文件库并在CMake文件Lib1和Core的帮助下也会被下载,编译和链接.

问题是Executable和Lib1依赖于Core但我希望它只被克隆(和编译)一次.这是问题所在:

  • 在Executable CMake克隆中,使用ExternalProject_Add功能构建Core.
  • 然后Cmake克隆Lib1并查找Core但它尚未安装,因此没有core-targets.cmake文件(core-config.cmake可用)...并且构建失败...

我不知道是否有文档化的方法来处理这种项目树,或者当Core被包含作为外部项目的依赖项时,我应该编写某种解决方法,以避免使用core-targets.cmake文件.

谢谢!


解

我意识到当使用ExternalProject_Add时,它会下载,构建和安装项目,因此,在install-folder中,我已经拥有了编译其依赖项所需的所有文件.

所以我可以按照这些步骤管理此问题(也适用于构建顺序):

  • *Core的 ExternalProject_Add*
  • *ExternalProject_Add*for Lib1传递Core install_dir作为参数
  • ......和可执行文件.

Ton*_*Big 1

我将向Executable添加两个便利项目,它们将包含在子文件夹中并使用ExternalProject_Add.

add_subdirectory( CoreWrapper ) # Use ExternalProject_Add here
add_subdirectory( Lib1Wrapper ) # Use ExternalProject_Add here
Run Code Online (Sandbox Code Playgroud)

现在,您可以将依赖项添加到Executable,以便在构建Executable之前安装所有内容,或者直接使用构建文件夹中包含的二进制文件。