记录学习CMake中碰到的一些问题和笔记
ps:CMake相比xmake来说确实太繁琐,但还是得学习🍭
现代CMake的命令行构建
在“古代”CMake中,我们想要构建项目要这样:
mkdir build
cd build
cmake ..
make
太啰嗦了,最后一步可能还用的不是make命令。不过在现代CMake中,提供了更为方便的 -B 和 –build,如下:
cmake -B build # 用于生成构建目录。-B 参数后面跟的是一个目录名,这里指定为 build
cmake --build build # 用于在已经生成的构建目录中构建项目
这样省去了创建build目录等繁琐的操作,还统一了不同平台上的构建命令。
如果碰到了有关build缓存的相关问题,可以使用rm删除build目录,或者使用cmake --build build --clean-first
来在构建之前先清理构建目录。
添加源文件的几种方法
假设当前项目文件目录如下:
.
├── CMakeLists.txt
├── include
│ └── add.h
└── src
├── add.cpp
└── main.cpp
即当前项目的源文件为src目录下的cpp文件,在顶层的CMakeLists.txt
中添加源文件目标:
# 方法一
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
指令,但内容却稍有区别:
- 都是按照通配符批量匹配文件,
GLOB
和GLOB_RECURSE
的区别在于后者允许*递归目录去匹配 - 对于选项
CONFIGURE_DEPENDS
,如果不添加,则在src/下添加新文件,由于cmake缓存的原因,SOURCE_FILES
变量并不会更新,需要重新执行cmake -B build
设置可执行文件的输出位置
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)