CMake学习笔记(1)使用CMake编译单源文件程序

这是我在学习使用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为该工程产生一个可以重新分发的包。

欢迎关注我的微信公众号 江达小记

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章