文章导读
各位编程爱好者,是不是经常遇到不同环境下编译命令不兼容的问题?CMake就是来解决这个痛点的神器!今天,我们就来聊聊CMake,从入门到实践,让你轻松掌握这个强大的工具!
一、为啥要学习CMake?
不同环境下Makefile格式是不兼容的,这就是我们要学习CMake的原因。不信你看完这篇文章,还不知道CMake是啥?
最近开始搞SLAM,要运行视觉SLAM十四讲上的一些实践案例,里边涉及到CMake的相关知识。本来觉得CMake大概会用就行,但是照着CSDN上一些教程运行了一些小例程,感觉还是走马观花,没搞清楚,决定自己写一个来记录如何使用CMake。
二、Ubuntu自己的编译命令
在Ubuntu中,我们比较常见的编译器是gcc和g++,前者编译.c文件,后者编译.cpp文件。以g++编译命令为例,可以在网上查到它命令选项,例如该文章g++编译命令选项里边可以查到很多有关编译命令的变化。每本书或教材应该都有相关使用的讲解,这里不再赘述最基本的编译命令的使用。
几个基本步骤:预处理–编译–汇编–链接
下图展示了我的一些g++编译命令实践,能看懂就没啥问题(里边有不小心打错的命令哦)。
g++ -o demo1 main.cpp
三、咱们怎么玩CMake?
参照网上入门CMake的一些教程,我们也从最简单的一个.cpp+一个CMakeLists.txt开始,逐步过渡到多个源文件、多个目录,再到自定义选项等略微高级的操作。每个阶段主要说明CMakeLists.txt各行代码的含义。
四、Demo1:一个源文件.cpp,一个CMakeLists.txt
工程经过cmake和make后,长这个样子:
CMakeLists.txt
CMakeLists.txt中代码及解释如下:
CMAKE_MINIMUM_REQUIRED(VERSION 3.10)
PROJECT(Demo1)
ADD_EXECUTABLE(demo1 main.cpp)
有意思的是,参照网上一些博客的说法,CMake的内置指令是不区分大小写的(比如PROJECT),而其内置参数是区分大小写的,写的时候要注意一下。
经过编译,生成了名叫demo1的可执行文件,运行时比较有讲究,举个例子,这里需要用到main函数的直接传入参数,具体内容可以参照该篇博文:关于int main( int argc, char* argv[] ) 中arg和argv参数的解析及调试。
具体的输入指令及结果如下:
./demo1 2 5
这里程序计算了2^5,结果为32。
五、Demo2:同一目录,多个源文件
(此处省略Demo2的详细内容,与Demo1类似,逐步过渡到更复杂的情况。)
小结与拓展
本文介绍了CMake的基本使用方法,从简单的单文件项目到多文件、多目录项目,希望对大家有所帮助。CMake是一个功能强大的工具,还有许多高级特性等待大家去探索。如果你对CMake感兴趣,可以关注极星编程网(www.jxgpc.com)了解更多内容。
——苏承栈/极星编程网
