CMake 入门教程之二常用命令

查找文件

查找源文件

1
2
3
4
5
6
7
8
# 查找 src 目录下的所有源文件,并保存到 SOURCE_FILES 变量
aux_source_directory(src SOURCE_FILES)

# 查找 src 目录下所有以 .cpp 开头的文件,并保存到 SOURCE_FILES 变量
file(GLOB SOURCE_FILES "src/*.cpp")

# 递归查找 src 目录下所有以 .cpp 开头的文件,并保存到 SOURCE_FILES 变量
file(GLOB_RECURSE SOURCE_FILES "src/*.cpp")

排除指定的文件

1
2
3
4
5
# 查找 src 目录下所有以 .cpp 开头的文件,并保存到 SOURCE_FILES 变量
file(GLOB SOURCE_FILES "src/*.cpp")

# 排除 example.cpp 源文件
list(FILTER SOURCE_FILES EXCLUDE REGEX "example.cpp")

输出目录

指定输出目录

1
2
3
4
5
# 指定构建输出的目录(build 目录)
set(PROJECT_BINARY_DIR ${PROJECT_SOURCE_DIR}/build)

# 指定可执行文件的输出目录(bin 目录)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

编译代码

设置编译参数

1
2
3
4
5
6
7
set(CMAKE_CXX_COMPILER   "clang++")                # 指定使用的 C++ 编译器
set(CMAKE_CXX_FLAGS "-std=c++11") # 指定使用的 C++ 的版本
set(CMAKE_CXX_FLAGS "-g") # 输出调试信息
set(CMAKE_CXX_FLAGS "-Wall") # 开启所有警告
set(CMAKE_CXX_FLAGS_DEBUG "-O0") # 调试包不优化
set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG") # 发布包优化
set(CMAKE_CXX_FLAGS "-lpthread") # 链接 pthread 库

设置预处理指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>

using namespace std;

int main() {

#ifdef TARGET
cout << "Hello!" << endl;
#else
cout << "World!" << endl;
#endif

return 0;
}
  • CMake 指定编译参数
1
set(CMAKE_CXX_FLAGS "-DTARGET")

调试信息

打印日志信息

提示

使用 MESSAGE() 指令可以输出指定的日志信息,例如打印 CMake 变量的值

1
2
3
4
5
6
# 查找 GoogleTest 库
FIND_PACKAGE(GTest REQUIRED)

# 显示 GoogleTest 库的路径
MESSAGE(STATUS "GTEST_INCLUDE_DIRS : " ${GTEST_INCLUDE_DIRS})
MESSAGE(STATUS "GTEST_BOTH_LIBRARIES : " ${GTEST_BOTH_LIBRARIES})

链接第三方库

查找并链接系统的第三方库

这里以第三方库 GoogleTest 为例子,其中 GoogleTest 是手动安装到 Linux 系统上的(编译安装或者通过包管理器安装)。

1
2
3
4
5
6
7
8
9
# 查找 GoogleTest 库
find_package(GTest REQUIRED)

# 显示 GoogleTest 库的路径
MESSAGE(STATUS "GTEST_INCLUDE_DIRS : " ${GTEST_INCLUDE_DIRS})
MESSAGE(STATUS "GTEST_BOTH_LIBRARIES : " ${GTEST_BOTH_LIBRARIES})

# 链接 GoogleTest 库
target_link_libraries(${PROJECT_NAME} ${GTEST_BOTH_LIBRARIES})