CMake初级简明教程

我藏在人群中 然后失去晴空
像我的名字 从你的记忆清空 。—《你头顶的风》
本文仅仅介绍了一些常用函数的参数的简单写法以及个人理解,如果你想了解更多,可以去查找专门介绍该函数的博客 。本文只能保证你读完之后对各个函数有基本的认识,以及最基本的应用 。
个人认为,想要提高自己写能力的最好方法有两个 。其一者,自己编写更加复杂的工程文件 。其二者,阅读、修改现有库的 。有的库的有上百行(比如PCL库),但是其实看明白之后就是很简单的几个模块判断、引入 。尤其是后者,小学写过的字帖都有三部分:描红,仿影,临帖 。先看人家怎么写,学会笔法之后再写自己的,编程学习之法可谓相同 。
笔者才疏学浅,知识均由自学得来,故可能多有错漏 。本文仅作抛砖引玉之用,欢迎读者斧正 。
1.ed
含义:要求cmake的最小版本
示例:
cmake_minimum_required(VERSION 2.8)
说明:
ed()命令隐式调用()命令,以指定为给定范围的cmake版本编写当前项目代码 。
个人理解:
cmake各个版本在查找文件的策略等等上会有一些差异 。通过这个函数指定最小版本 。以保证当前的策略是你想要的策略 。
对于初学者,无需管这个,随便指定一个就可以,例如 2.8.
2.
含义:指定本工程名称
示例:
project(test)
个人理解:
指定工程名称,随便起一个名字就可以 。需要注意的是,这个指定的不是编译出来的exe或者是可执行文件的名字,那个是通过另一个函数指定的 。这个就是工程的名字 。
3.set
含义:设定变量的值
示例:
set(PCL_ROOT "D:/program-tools/PCL/PCL 1.12.1") //设定PCL_ROOT值为后面的路径set(_waiting_for_debug 0) //设定值为0set(DEFAULT_CXX_STANDARD 11)//设定值为11
个人理解:
这个函数基本可以看作赋值用的,需要注意的是,编译器往往有一些预定义的值,例如示例里面的 ,这个是编译器预定义的值,通过将其置为11,可以设定编译规范为C++11.
这个函数另一个重要作用就是指定库的路径,例如示例中的第一行,指定了PCL库的ROOT根目录 。这一点我们下面也会谈到 。
4.
这个函数非常非常非常重要,你编译的时候找不到包大部分都是因为这个函数使用不当引起的 。而且有些问题非常隐秘 。这一部分可能有点多,但是请务必看下去,不然到时候你debug一天也找不到问题的时候可不要后悔哦 。
cmake本身不提供任何搜索库的便捷方法,所有搜索库并给变量赋值的操作必须由cmake代码完成,比如.cmake和.cmake 。只不过,库的作者通常会提供这两个文件,以方便使用者调用 。
例如,以著名的点云库PCL为例,其部分文件夹结构如下:
---PCL|---PCL 1.12.1|---include|--- ...(略,一些头文件)|---lib|--- ...(略,一些库文件)|---cmake|---PCLConfig.cmake|---PCLConfigVersion.cmake|---Modles|---FindEigen.cmake|---FindFLANN.cmake|---FindQhull.cmake|---FindOpenMP.cmake|--- ...(略,其余的依赖cmake文件)|--- ...(其他文件夹)
观察上面的文件夹结构,作者特意把cmake文件独立一个文件夹,而其库引导文件.cmake就在cmake目录下,我们不妨称之为根引导文件 。在这个根引导文件的同级目录下,有一个文件夹,里面的文件都是诸如.cmake之类,顾名思义,显然是找到PCL库的其他依赖库的引导文件 。我们不用打开根引导文件也能猜到,想必是这个.cmake调用了文件夹里面的这些小的查找文件,去查找所需的依赖库 。所以怎么办,你只要让cmake找到这个.cmake根引导文件就可以了 。这个根文件会自动调用其他查找文件 。