cmake 在 win 中的编译需要使用的一些配置,主要是记录曾经使用情况

Release 生成PDB

1
2
3
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Zi")
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /DEBUG /OPT:REF /OPT:ICF")
set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /DEBUG /OPT:REF /OPT:ICF")

cmake原生中的配置

1
2
3
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO}")
set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO}")
  • CMAKE_CXX_FLAGS_RELEASE: /MD /O2 /Ob2 /DNDBUG

  • CMAKE_CXX_FLAGS_RELWITHDEBINFO: /MD /O2 /Ob1 /DNDBUG /Zi

  • CMAKE_SHARED_LINKER_FLAGS_RELEASE: /INCREMENTAL:NO

  • CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO: /debug /INCREMENTAL

  • /Zi: 调试信息不包含在对象文件或可执行文件中,这使得这些文件最小

  • /MD: 动态运行时依赖库, /MT 是静态运行时库

  • /O2: O2 会尝试更多的寄存器级的优化以及指令级的优化,它会在编译期间占用更多的内存的编译时间

  • /O1: O1 优化会消耗少得多的编译时间。主要对代码的分支,常量以及表达式等进行优化

  • /O3: 在 O2 基础上进行更多的优化,例如使用伪寄存器网络,普通函数的内联以及针对循环的更多优化

  • /O0: 不做任何优化,默认编译选项

  • /OPT:REF: 清除从未引用的函数和数据

  • /OPT:ICF: 从链接器中删除冗余的 COMAT

  • /INCREMENTAL: debug 的情况下默认是这个选项