跳到主要内容

CMake 设置编译模式

Debug 和 Release 版本

对于一个 C/C++ 程序来说,通常会有 Debug 和 Release 两种版本。

  • Debug 版本(调试版本):包含调试信息,所以容量比 Release 大很多,并且不进行任何优化(优化会使调试复杂化,因为源代码和生成的指令间关系会更复杂),便于程序员调试。Debug 模式下生成两个文件,除了 .exe 或 .dll 文件外(Linux 系统对应 elf 和 .so 文件),还有一个 .pdb 文件,该文件记录了代码中断点等调试信息。
  • Release 版本(发布版本):不对源代码进行调试,编译时对应用程序的速度进行优化,使得程序在代码大小和运行速度上都是最优的。(调试信息可在单独的 PDB 文件中生成)。Release 模式下生成一个文件 .exe 或 .dll 文件(Linux 系统对应 elf 和 .so 文件)。

CMake 设置编译模式

对 CMake 工程进行编译时,可以通过 CMAKE_BUILD_TYPE 宏决定项目编译成 Debug 版本还是 Release 版本,默认为 Release 版本。

Debug 模式,可以进行 gdb 调试

mkdir debug
cd debug
cmake -DCMAKE_BUILD_TYPE=Debug ..
make

Release 模式

mkdir release
cd release
cmake -DCMAKE_BUILD_TYPE=Release ..
make

当然,你也可以在 CMakeLists.txt 文件中指定编译模式,如下。

SET(CMAKE_BUILD_TYPE "Debug")
# 或者
SET(CMAKE_BUILD_TYPE "Release")

检查是否带 Debug 信息

编译完成后,我们可以使用 readelf 命令来查看该二进制可执行文件是否包含 debugging symbols 信息。

例如:查看 debug/bin/Template 的 Section 头部信息,可以看到 debug 相关的符号。

$ readelf -S debug/bin/Template | grep debug
[28] .debug_aranges PROGBITS 0000000000000000 0000609b
[29] .debug_info PROGBITS 0000000000000000 0000615b
[30] .debug_abbrev PROGBITS 0000000000000000 00007c79
[31] .debug_line PROGBITS 0000000000000000 0000823b
[32] .debug_str PROGBITS 0000000000000000 00008cdc

而查看 release/bin/Template 的 Section 头部信息,则没有打印任何内容。

$ readelf -S release/bin/Template | grep debug