【CMake】CMake使用笔记

记录学习CMake中碰到的一些问题和笔记

ps:CMake相比xmake来说确实太繁琐,但还是得学习🍭

现代CMake的命令行构建

在“古代”CMake中,我们想要构建项目要这样:

1
2
3
4
mkdir build
cd build
cmake ..
make

太啰嗦了,最后一步可能还用的不是make命令。不过在现代CMake中,提供了更为方便的 -B 和 --build,如下:

1
2
cmake -B build # 用于生成构建目录。-B 参数后面跟的是一个目录名,这里指定为 build
cmake --build build # 用于在已经生成的构建目录中构建项目

这样省去了创建build目录等繁琐的操作,还统一了不同平台上的构建命令。

如果碰到了有关build缓存的相关问题,可以使用rm删除build目录,或者使用cmake --build build --clean-first来在构建之前先清理构建目录。

添加源文件的几种方法

假设当前项目文件目录如下:

1
2
3
4
5
6
7
.
├── CMakeLists.txt
├── include
│ └── add.h
└── src
├── add.cpp
└── main.cpp

即当前项目的源文件为src目录下的cpp文件,在顶层的CMakeLists.txt中添加源文件目标:

1
2
3
4
5
6
7
8
9
10
11
# 方法一
file(GLOB SOURCE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")

# 方法二
file(GLOB_RECURSE SOURCE_FILES CONFIGURE_DEPENDS ${PROJECT_SOURCE_DIR}/src/*.cpp)

# 方法三
aux_source_directory(${PROJECT_SOURCE_DIR}/src SOURCE_FILES)

# 添加下面这一句即用上述源文件生成可执行文件app(也可使用add_library生成库文件等)
add_executable(app ${SOURCE_FILES})

可以看到,方法一和方法二虽然都是使用file指令,但内容却稍有区别:

  1. 都是按照通配符批量匹配文件,GLOBGLOB_RECURSE的区别在于后者允许*递归目录去匹配
  2. 对于选项CONFIGURE_DEPENDS,如果不添加,则在src/下添加新文件,由于cmake缓存的原因,SOURCE_FILES变量并不会更新,需要重新执行cmake -B build

设置可执行文件的输出位置

1
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)