这些选项不是 CMake 独有,而是 GCC / Clang / MSVC 等编译器提供的参数。
CMake 中通过 target_compile_options() 传递。
GCC / Clang 警告相关
| 选项 | 作用 |
|---|---|
| -Wall | 开启常见警告 |
| -Wextra | 开启额外警告 |
| -Wpedantic | 严格遵守 C/C++ 标准 |
| -Werror | 将警告视为错误 |
| -Wshadow | 检测变量隐藏 |
| -Wconversion | 检测隐式类型转换 |
| -Wsign-conversion | 检测有符号/无符号转换 |
| -Wunused | 检测未使用变量 |
| -Wuninitialized | 检测未初始化变量 |
示例:
# 常见组合
target_compile_options(MyApp PRIVATE
-Wall
-Wextra
-Wpedantic
)
# 严格项目
target_compile_options(MyApp PRIVATE
-Wall
-Wextra
-Werror
)优化相关
常用 -O0当作Debug模式,Release 用 -O2
| 选项 | 作用 |
|---|---|
| -O0 | 关闭优化,方便调试 |
| -O1 | 基础优化 |
| -O2 | 常用发布优化 |
| -O3 | 激进优化 |
| -Os | 优化程序大小 |
| -Ofast | 极限性能优化(可能违反标准) |
| 选项 | 作用 |
调试相关
- 在 CMake 项目里,即使你从来没手动写过 -g 之类的选项,只要构建类型是 Debug(默认会自动添加 -g),就能直接用 gdb 进行源码级调试。
但如果是 Release 等模式,默认不加 -g,可执行文件里几乎没有调试信息,此时 gdb 虽然能启动,却只能看到汇编指令,看不到变量名、行号,几乎没法正常调试。
选项 作用 -g 生成调试信息 -g1 少量调试信息 -g2 默认调试信息 -g3 完整调试信息
C++ 标准相关
| 选项 | 作用 |
|---|---|
| -std=c++11 | C++11 |
| -std=c++14 | C++14 |
| -std=c++17 | C++17 |
| -std=c++20 | C++20 |
| -std=c++23 | C++23 |
现代CMake推荐:
target_compile_features(App PRIVATE
cxx_std_20
)预处理相关
.....
Sanitizer 检测工具
用于发现运行时错误。 GCC/ Clang 在高版本都开始自带,但还需要连接一下一个运行库 libasan检测:
- 越界访问
- use-after-free
内存错误
# 编译选项 target_compile_options(my_app PRIVATE -fsanitize=address) # 链接选项(同样需要) target_link_options(my_app PRIVATE -fsanitize=address)
UndefinedBehaviorSanitizer
检测:
- 未定义行为
- 整数溢出
非法转换
target_link_options(App PRIVATE -fsanitize=undefined )
CPU 架构优化
不适合发布给其他机器。
| 选项 | 作用 |
| -march=native | 针对当前 CPU 优化 |
| -mtune=native | 针对 CPU 调优 |
| -mavx | 启用 AVX |
| -msse4 | 启用 SSE4 |
线程支持
-pthread
CMake 推荐
find_package(Threads)
target_link_libraries(App
PRIVATE Threads::Threads
)作用:
- 开启线程支持
- 链接 pthread
位置无关代码
-fPIC 让动态库的指令段与加载地址无关,使得多个进程可以共用同一份物理内存中的代码,从而节省内存并提升安全性。这是现代共享库工作方式的基石。一般在Linux 动态库 中比较常见。| 选项 | 作用 |
|---|---|
| -fPIC | 生成位置无关代码 |
动态库示例:
add_library(MyLib SHARED lib.cpp)
target_compile_options(MyLib PRIVATE
-fPIC
)生成汇编 / 预处理文件
。。。。
C++ Modules 相关
...
MSVC 常用选项
| 选项 | 作用 |
|---|---|
| /W4 | 高级警告 |
| /WX | 警告当错误 |
| /O2 | 优化 |
| /Od | 关闭优化 |
| /Zi | 调试信息 |
| /std:c++20 | C++20 |
target_compile_options(App PRIVATE
/W4
/WX
) 