CMake管理工程
在Linux平台下使用CMake生成Makefile并编译的流程如下:
- 编写CMake配置文件CMakeLists.txt
- 执行命令cmake PATH生成Makefile,PATH是CMakeLists.txt所在的目录。
- 使用make命令进行编译。
简单讲就是CMake是自动生成Makefile文件的工具
安装CMake
1 | sudo apt-get install cmake |
创建CMakeLists.txt 骨架
1 | # CMake 最低版本号要求 不写会有警告 |
CMakeLists.txt中的编写方法
1 | project(Demo1) # App的名称,需要修改⭐️ |
测试程序的CMakeList编写方法
1 | # 执行cp命令 |
cmake find_package的基本原理
比如说,我们需要一个第三方库 curl,那么我们的 CMakeLists.txt 需要指定头文件目录,和库文件,类似
1 | include_directiories(/usr/include/curl) |
如果借助于cmake提供的finder会怎么样呢?使用cmake的Modules目录下的FindCURL.cmake,相应的CMakeList.txt 文件:
1 | find_package(CURL REQUIRED) |
那么cmake是如何查找的呢?
find_package()命令首先会在模块路径中寻找Find.cmake,这是查找库的一个典型方式。具体查找路径依次为CMake:变量{CMAKE_MODULE_PATH}中的所有目录。如果没有,然后再查看它自己的模块目录/share/cmake-x.y/Modules/($CMAKE_ROOT的具体值可以通过CMake中message命令输出)。这称为模块模式。
为了能支持各种常见的库和包,CMake自带了很多模块。可以通过命令 cmake –help-module-list (输入cmake –help,然后双击Tab会有命令提示)得到你的CMake支持的模块的列表: 直接查看模块路径。比如Ubuntu linux上,模块的路径是 ls /usr/share/cmake/Modules/:
1 | ll -th /usr/share/cmake-3.5/Modules/ |
让我们以bzip2库为例。CMake中有个 FindBZip2.cmake 模块。只要使用 find_package(BZip2) 调用这个模块,cmake会自动给一些变量赋值,然后就可以在CMake脚本中使用它们了。变量的列表可以查看cmake模块文件,或者使用命令:
1 | root@xy:~/cmake_practice/cmake_build/build_demo10# cmake --help-module FindBZip2 |
Filesystem
1 | file(GLOB <variable> |
产生一个匹配 <globbing-expressions>
的文件列表并将它存储到变量 <variable>
中。文件名替代表达式和正则表达式相似,但更简单。如果 RELATIVE
标志位被设定,将返回指定路径的相对路径。结果将按字典顺序排序。
如果 CONFIGURE_DEPENDS
标志位被指定,CMake 将在编译时给主构建系统添加逻辑来检查目标,以重新运行 GLOB
标志的命令。如果任何输出被改变,CMake都将重新生成这个构建系统。
注意:我们不推荐使用 GLOB 来从源文件树收集源文件列表。如果当源文件添加或删除时没有 CMakeLists.txt 文件被修改,那么在 CMake 重新生成时并不会识别出它们。
CONFIGURE_DEPENDS
标志位可能不会再所有生成器上可靠的工作,如果一个新的生成器在以后被添加,并不会被支持。如果项目使用它将会被卡主。即使CONFIGURE_DEPENDS
可靠的工作,在每个重新构建的过程中做检查也十分浪费性能。
交叉编译配置
1 | SET(TOOLSCHAIN_PATH /home/zero/sdk/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/) |
编译传参数
1 | CMake option |