这是我在学习使用CMake时记录的笔记,主要参考《CMake Cookbook》这本书。
用CMake编译单源文件程序,示例程序如下:
#include <cstdlib>
#include <iostream>
#include <string>
std::string say_hello() { return std::string("Hello, CMake world!"); }
int main() {
std::cout << say_hello() << std::endl;
return EXIT_SUCCESS;
}
CMakeLists.txt 如下:
# CMake 版本要求
cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
# 声明项目名称及语言
project(recipe-01 LANGUAGES CXX)
# 指导CMake创建目标程序
add_executable(hello-world hello-world.cpp)
构建命令:
mkdir -p build
cd build
cmake ..
# 以上三项等价于 cmake -H. -Bbuild
cmake --build .
cmake -H. -Bbuild
中的-H.
意味着在当前文件夹中查找CMakeList.txt
文件,-Bbuild
意味着在build
文件夹中生成编译所需的文件。该命令还在标准化中所以更建议使用传统的方式。
在创建的build
文件夹下有以下文件:
- Makefile:指导make构建工程的配置文件。
- CMakeFiles:存放临时文件,CMake在探测操作系统、编译器等的时候产生的临时文件。除此之外,根据所选生成器(在Unix类系统中是Unix Makefiles generator,在Windows上默认是Visual Studio)的不同,也会包含项目相关的文件。
- cmake_install.cmake:包含安装规则的CMake脚本,在安装时使用。
- CMakeCache.txt:CMake缓存
cmake --build .
是一个跨平台的命令,会调用平台原生的构建命令,在linux中调用make。
构建选项
在这个例子中的构建目标只有hello-world
这个可执行文件,但其实cmake支持更多构建选项。运行命令cmake --build . --target help
可以看到可用的构建项:
$ cmake --build . --target help
The following are some of the valid targets for this Makefile:
... all (the default if no target is provided)
... clean
... depend
... rebuild_cache
... hello-world
... edit_cache
... hello-world.o
... hello-world.i
... hello-world.s
这些构建选项可以通过cmake --build . --target <target-name>
生成。
- all (在VS生成器中为ALL_BUILD)为默认构建选项,将构建项目中的所有目标
- clean 清除所有生成的文件
- depend 调用CMake为源代码生成依赖项
- rebuild_cache 调用CMake重建CMakeCache.txt。这在源中添加了新的条目时需要用到。
- edit_cache 允许直接编辑缓存条目
对于有测试环节以及安装规则的更加复杂的工程,CMake会生成以下额外构建选项
- test (在VS生成器中为RUN_TESTS)将在CTest的支持下运行测试样例
- install 运行项目的安装规则。
- package 调用CPack为该工程产生一个可以重新分发的包。
欢迎关注我的微信公众号 江达小记