一、add_executable
作用:创建可执行程序
add_executable(app main.cpp)
意思是:
生成一个可执行文件 app
使用 main.cpp 编译
例如:
add_executable(MyApp
main.cpp
window.cpp
)
二、add_library
作用:创建库
add_library(math math.cpp)
默认生成:
静态库
Linux:
libmath.a
可以指定类型
静态库:
add_library(math STATIC math.cpp)
动态库:
add_library(math SHARED math.cpp)
仅接口库(header only):
add_library(utils INTERFACE)
三、include_directories
作用:添加头文件搜索路径
旧写法:
include_directories(include)
等价于:
g++ -Iinclude
例如:
目录:
project
├── include
│ └── math.h
└── main.cpp
代码:
#include "math.h"
就需要:
include_directories(include)
现代写法(推荐)
target_include_directories(app PRIVATE include)
区别:
| 写法 | 作用 |
|---|---|
| include_directories | 全局 |
| target_include_directories | 只作用某个target |
四、link_directories
作用:添加库文件搜索路径
旧写法:
link_directories(lib)
等价于:
g++ -Llib
如果:
lib/libmath.so
你就可以:
target_link_libraries(app math)
现代写法(基本不用)
推荐直接:
target_link_libraries(app /path/libmath.so)
或者:
find_package()
所以:
link_directories 已经不推荐使用
五、add_definitions
作用:添加宏定义
例如:
add_definitions(-DDEBUG)
等价于:
g++ -DDEBUG
代码:
#ifdef DEBUG
printf("debug\n");
#endif
现代写法
target_compile_definitions(app PRIVATE DEBUG)
六、target_link_libraries(最重要)
这个命令 90% 的 CMake 工程都会用。
作用:
链接库
例如:
target_link_libraries(app math)
等价:
g++ main.cpp -lmath
现代写法:
target_link_libraries(app PRIVATE math)
三种关键字:
| 关键字 | 作用 |
|---|---|
| PRIVATE | 只当前target |
| PUBLIC | 当前 + 依赖者 |
| INTERFACE | 只依赖者 |
七、target_compile_options
作用:添加编译参数
例如:
target_compile_options(app PRIVATE -Wall)
等价:
g++ -Wall
八、target_compile_features
设置 C++ 标准:
target_compile_features(app PRIVATE cxx_std_17)
或者:
set(CMAKE_CXX_STANDARD 17)
九、add_subdirectory
作用:引入子目录 CMake
例如:
project
├── src
├── lib
└── CMakeLists.txt
主 CMake:
add_subdirectory(lib)
add_subdirectory(src)
十、find_package
作用:查找第三方库
例如 Qt:
find_package(Qt6 REQUIRED COMPONENTS Widgets)
然后:
target_link_libraries(app Qt6::Widgets)
十一、file
操作文件:
file(GLOB SRC *.cpp)
然后:
add_executable(app ${SRC})
不过:
⚠️ 大型工程不推荐 GLOB。
十二、总结一下常见命令
最核心的一些:
| 命令 | 作用 |
|---|---|
| project | 定义工程 |
| add_executable | 生成程序 |
| add_library | 生成库 |
| target_link_libraries | 链接库 |
| target_include_directories | 头文件 |
| target_compile_definitions | 宏 |
| target_compile_options | 编译参数 |
| add_subdirectory | 子模块 |
| find_package | 第三方库 |
十三、现代 CMake 推荐写法
你以后最好写成这样:
cmake_minimum_required(VERSION 3.16)
project(MyProject)
add_library(math math.cpp)
target_include_directories(math
PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}
)
add_executable(app main.cpp)
target_link_libraries(app
PRIVATE
math
)
特点:
所有配置都绑定到 target