简介
CMake是一个比make更高级的编译配置工具,它可以根据不同平台、不同的编译器,生成相应的Makefile或者vcproj项目。通过编写CMakeLists.txt,可以控制生成的Makefile,从而控制编译过程。CMake自动生成的Makefile不仅可以通过make命令构建项目生成目标文件,还支持安装(make install)、测试安装的程序是否能正确执行(make test,或者ctest)、生成当前平台的安装包(make package)、生成源码包(make package_source)、产生Dashboard显示数据并上传等高级功能,只要在CMakeLists.txt中简单配置,就可以完成很多复杂的功能,包括写测试用例。如果有嵌套目录,子目录下可以有自己的CMakeLists.txt。
步骤
- 编写
CMakeLists.txt
- 执行命令
cmake PATH
或ccmake PATH
生成Makefile
- 使用
make
命令编译,make -j4
指定编译并行度 - 使用
make install
安装
编译
指定安装路径
参考 这里
1 | 3.15 + |
指定编译类型
1 | 1 |
语法
CMakeLists.txt 的语法比较简单,由命令、注释和空格组成。#
后面的是注释。
commond (args ...)
- commond为命令名,大小写不敏感
- args为参数
- 如果包含空格,使用双引号
变量引用
变量引用用 ${VAR}
语法
命令
set
set
命令将多变量放在一起。
1 | set (Foo a b c) |
commond(${Foo})
等价于command(a b c)
commond("${Foo}")
等价于command("a b c")
cmake_minimum_required
指定运行此配置文件所需的CMake的最低版本。
cmake_minimum_required (VERSION 2.8)
project
指定项目信息。
1 | project (Demo) |
add_executable
指定生成目标。
1 | add_executable(Demo demo.cpp) |
aux_source_directory
查找指定目录下的所有源文件,将结果存进指定变量名。
1 | aux_source_directory(<dir> <variable>) |
1 | cmake_minimum_required (VERSION 2.8) |
add_subdirectory
指明项目包含一个子目录,这样该目录下的CMakeLists.txt
文件和源文件也会被处理。
1 | add_subdirectory(math) |
target_link_libraries
指明可执行文件需要链接的库。
1 | target_link_libraries(Demo MathFunctions) |
add_library
将指定的源文件生成链接文件,然后添加到工程中去
1 | aux_source_directory(. DIR_LIB_SRCS) |
link_directories
指定连接器查找库的文件夹。此命令的相对路径被解释为相对于当前源目录。
格式
1 | link_directories(directory1 directory2 ...) |
示例
1 | link_directories(${PROJECT_BINARY_DIR}/third_party/googletest/) |
include_directories
将给定的目录添加到编译器用来搜索头文件的目录中。相对路径被解释为相对于当前源目录。
格式
1 | include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...]) |
示例
1 | include_directories(${PROJECT_SOURCE_DIR}/third_party/glog/) |
find_package_handle_standard_args
用于 find_package 的实现。
变量
Cache
1 | # CACHE, 不覆盖已有值. |
常用变量
- PROJECT_BINARY_DIR
- Full path to build directory for project.
- PROJECT_SOURCE_DIR
- Top level source directory for the current project.
- CMAKE_CURRENT_SOURCE_DIR
- This the full path to the source directory that is currently being processed by cmake.
Scope
1 | add_subdirectory : 建立新的 scope |
示例
1 | bovenson@HP:~/Git/notes/C++/Code/CMake/test$ tree |