CMake - 将依赖项添加到其他项目

时间:2016-03-15 13:20:15

标签: cmake

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

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

每个ModuleN都有自己的CMakeLists.txt文件,必须能够在将它们组合到整个项目之前进行编译,测试和完成。现在,我很困惑使用什么方法来使这些依赖项工作。

我的研究向我展示了一些方法(比如添加add_directory指令等),但其中一些人抱怨说这样可以不必要地多次编译项目(比如本例中的Module1) ;或要求提供完整的途径。

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

此外,人们通常建议在项目的根目录中放置CMakeLists.txt文件,但我认为这样我们总是必须从根目录构建 - 因此无法单独构建和测试模块。 / p>

使这成为可能的“noob方式”是什么?正如我所说的,我对CMake很新,老实说我甚至不知道搜索这样的东西的“关键字”(搜索“添加依赖”会带来一些我只是被淹死的结果:))

2 个答案:

答案 0 :(得分:2)

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

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

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

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

深吸一口气,阅读文档(两次!)

答案 1 :(得分:1)

CMakeLists.txt文件放在根目录下完成工作。这并不意味着您每次都必须编译所有内容。当您运行CMake命令(或CMake GUI)时,您将为整个项目生成一组makefile,Xcode项目,Visual C ++解决方案等。但是你可以自由编译你想要的东西。实现这一目标的方式取决于您将选择的代(IDE项目,makefile,Ninja文件等)。

要理解的主要内容是CMake生成和编译是两个独立的步骤。

  • CMake生成:来自CMakeLists.txt个文件,生成一个项目或一组makefile
  • 编译:从CMake生成的“东西”和你的源代码,创建库,软件等。