CMake - 添加对其他项目的依赖项

标签 cmake

我对 CMake 还很陌生,我和我的同事决定在我们正在开发的一些项目中使用它。在这项工作中,每个人都负责项目的某些模块。布局如下:

ROOT
  -> Module1
     ...
  -> Module2 (depends on Module 1)
     ...
  -> Module3 (depends on Module 2 and 1)

每个ModuleN有自己的CMakeLists.txt文件,并且必须能够编译、测试和完成,然后才能将它们组合到整个项目中。现在,我对使用什么方法使这些依赖项起作用感到非常困惑。

我的研究向我展示了一些方法(例如添加 add_directory 指令等),但其中一些人提示这种方式可以不必要地多次编译项目(例如本例中的 Module1 );或者需要给出完整路径。

该项目不会安装到目标计算机上,因此我也无法使用系统库文件夹、包含程序等。每个开发人员都在不同的文件夹中拥有此存储库,因此我也无法提供“准确”的文件夹。我可以使用类似“../Module1”的语法来表示 add_directory命令?这会导致“不必要的构建”吗?

此外,人们通常建议输入 CMakeLists.txt文件也在项目的根目录中,但我认为这样我们总是必须从根目录构建 - 因此模块不能单独构建和测试。

使这成为可能的“菜鸟方法”是什么?正如我所说,我对 CMake 很陌生,老实说,我什至不知道搜索这样的东西的“关键字”(搜索“添加依赖项”会带来一些我只是淹没在其中的结果:))

最佳答案

Module1 中的 CMakeLists.txt 应创建一个库目标 [add_library(Module1 ...sources...)](例如称为 Module1)。

Module2 中的目标可以链接此库 [target_link_library(mytarget Module1)]。

然后模块 3 可以链接模块 2 中的目标。

您还可以为目标 Module1 和 Module2 注入(inject)公共(public)和私有(private)包含目录,以便使用它们的目标可以继承包含搜索路径。

深呼吸并阅读文档(两次!)

关于CMake - 添加对其他项目的依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36012523/

相关文章:

cmake - 使用 cmake 生成构建目标时找不到 CONAN_PKG::<PKG-NAME>

c++ - CMake + Qt + GTest 文件链接

ffmpeg - 如何调用特定的 FFMPEG 测试?

c++ - cmake 不考虑-pthread

c++ - CMake 选项禁用特定平台特定文件的编译

cmake 使用 PUBLIC_HEADER 将库和开发文件安装为单独的组件

c++ - 如何为 CMAKE 外部项目指定编译器?

cmake - 缺少的变量是 : CMAKE_CUDA_COMPILE_WHOLE_COMPILATION

c++ - boost 日志链接错误(Cmake Mingw32)

mysql - 找不到符号 mysql_select_db@libmysqlclient_16 的版本节点