5

我想知道如何管理外部项目的依赖关系。假设我有三个项目,每个项目都在不同的存储库中:

  1. 核心:库导出了很多有用的东西。
  2. Lib1:具有一些特定类的库(取决于Core)。
  3. Executable:使用来自CoreLib1的东西。

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


现在我试图让这个过程尽可能简单,并且我正在引入 ExternalProject_Add 宏,这样人们只需要克隆Executable存储库,并且在 CMake 文件Lib1Core的帮助下也可以下载、编译和链接。

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

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

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

谢谢!


解决方案

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

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

  • *ExternalProject_Add* 用于核心
  • *ExternalProject_Add* 用于将核心 install_dir 作为参数传递的Lib1
  • ...和可执行文件
4

1 回答 1

1

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

add_subdirectory( CoreWrapper ) # Use ExternalProject_Add here
add_subdirectory( Lib1Wrapper ) # Use ExternalProject_Add here

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

于 2013-09-09T09:00:48.023 回答