这些选项不是 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++11C++11
-std=c++14C++14
-std=c++17C++17
-std=c++20C++20
-std=c++23C++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++20C++20
target_compile_options(App PRIVATE
    /W4
    /WX
)