目录在学习云计算相关知识的时候遇到了这个概念,查找资料后有了一定的了解,记录下来,一方面增加自己的理解,另一方面希望能够帮助到有需要的人。
- 一 CMake定义
- 二 网上高赞的理解
- 1. CMake
- 2. makefile
- 3. 二者关系
- 4. CMake的Helloworld示例
- 三 个人理解
- 四 总结
CMake是一个跨平台、开源的构建系统。它是一个集软件构建、测试、打包于一身的软件。比如它能根据源码和预先配置好的构建配置文件构建出Visual Studio的.sln文件或者Linux中的Makefile、启动编译过程、启动单元测试、打包可执行文件及依赖到指定目录。
简单来说它是用来构建项目的。
二 网上高赞的理解 1. CMake假如我们有一个深度学习框架的部分工程列表,里面有超过40个互相调用的工程共同组成,一些用于生成库文件,一些用于实现逻辑功能。他们之间的调用关系复杂而严格,如果我想在这样复杂的框架下进行二次开发,显然只拥有它的源码是远远不够的,还需要清楚的明白这几十个项目之间的复杂关系,在没有原作者的帮助下进行这项工作几乎是不可能的。
即使是原作者给出了相关的结构文档,对新手来说建立工程的过程依旧是漫长而艰辛的,因此CMake的作用就凸显出来了。原作者只需要生成一份CMakeLists.txt文档,框架的使用者们只需要在下载源码的同时下载作者提供的CMakeLists.txt,就可以利用CMake,在”原作者的帮助下“进行工程的搭建。
2. makefile一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
3. 二者关系Cmake是用来makefile的一个工具:读入所有源文件之后,自动生成makefile。
CMake通过CMakeLists.txt文件配置项目构建过程,该文件通常位于项目根目录。其他还有xxx.cmake格式的文件,这种文件的功能类似C++中的头文件,可以被include进CMakeLists.txt中,实现对构建配置的扩展。
(1) 项目目录、配置CMakeLists.txt
- 创建src目录,包含hello.cpp文件;
- 根目录创建CMakeLists.txt;
- build目录是空目录,执行构建过程(构建过程会产生一些配置文件,为了防止污染源码,在一个独立文件夹中构建);
上图CMakeLists.txt文件解释: - project(hello) 配置项目名为hello;
- add_executable(hello src/hello.cpp) 配置生成可执行文件,可执行文件名为hello,参与链接的文件是src/hello.cpp;
(2) 生成解决方案
通过使用cmake命令,指定根目录的CMakeLists.txt位置,生成项目解决方案。
以上便生成了Visual Studio的解决方案hello.sln和hello项目的工程配置hello.vcxproj。
(3) 构建
上一步只是生成了解决方案,我们想要的hello.exe还没有生成。可以用图形界面打开hello.vcproj生成,也可以直接通过命令行生成。
在build目录执行 cmake --build .:
- 简单理解项目的开发过程:构建–>编译–>测试–>打包部署;
- 源代码(只是肉体,不代表项目,因为它没有项目模块之间的依赖关系)、CMakeLists.txt文档 + Cmake命令 → makefile,这是一个构建项目的过程;
- makefile记录了编译规则,通过make指令可以对项目进行编译;
- 后续过程略。
如有见解,欢迎交流;如有侵权,请联系我删除。
参考文章:
- CMake从入门到入门
- CMake是什么?有什么用?



