我对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很新,老实说我甚至不知道搜索这样的东西的“关键字”(搜索“添加依赖”会带来一些我只是被淹死的结果:))
答案 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生成和编译是两个独立的步骤。
CMakeLists.txt
个文件,生成一个项目或一组makefile