CMake基础: 在release模式下生成调试信息的方法

目录

1.背景

2.解决方法

2.1.使用CMake编译选项

2.2.使用CMake的add_compile_options和add_link_options

2.3.使用CMake的target_compile_options和target_link_options

[2.4.使用 CMake 内置的 RelWithDebInfo 模式](#2.4.使用 CMake 内置的 RelWithDebInfo 模式)


1.背景

在使用CMake生成的软件时,不知道什么情况软件在使用的过程崩溃了,于是就需要在release模式生成调试信息pdb,动态调试排查原因。下面就来讲讲几种可行的方法。

2.解决方法

2.1.使用CMake编译选项

CMakeLists.txt 中添加以下配置,兼容 GCC/Clang 和 MSVC 编译器:

cpp 复制代码
cmake_minimum_required(VERSION 3.15)
project(DebugInRelease)

# 设置C++标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 为Release模式添加调试信息,保留优化等级
if(MSVC)
    # MSVC: /Zi 生成pdb调试文件,/O2 保留Release优化
    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Zi /O2")
    # 确保生成独立的pdb文件(不嵌入二进制)
    set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /DEBUG /OPT:REF /OPT:ICF")
else()
    # GCC/Clang: -g 生成调试符号,-O3 保留Release优化
    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -g -O3")
endif()

# 添加可执行文件
add_executable(${PROJECT_NAME} main.cpp)

CMake指令:目标属性相关指令(target_xxx)

你也可以使用add_compile_options和add_link_options来添加编译和连接选项。

cpp 复制代码
if(MSVC)
    add_compile_option($<$CONFIG:Release>:/Zi>)
    add_link_options($<$CONFIG:Release>:/DEBUG)
endif()

CMake进阶:生成器表达式

如果你只想针对特定的目标使用这些选项,可以使用target_compile_options和target_link_options

cpp 复制代码
if(MSVC)
    target_compile_options(target_xxx  PRIVATE $<$CONFIG:Release>:/Zi>)
    add_link_options(target_xxx PRIVATE  $<$CONFIG:Release>:/DEBUG)
endif()

2.4.使用 CMake 内置的 RelWithDebInfo 模式

CMake 提供了自带调试信息的 Release 模式 RelWithDebInfo,无需手动修改编译选项,直接指定构建类型即可:

cpp 复制代码
# Linux/macOS 终端编译
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo ..
make -j8

# Windows VS2019 命令行编译
mkdir build && cd build
cmake -G "Visual Studio 16 2019" -A x64 -DCMAKE_BUILD_TYPE=RelWithDebInfo ..
cmake --build . --config RelWithDebInfo

该模式默认包含 Release 级优化 + 完整调试信息,是更推荐的便捷方案

验证调试信息是否生成

  • MSVC :编译后在 build/Release 目录下会生成 .pdb 调试文件。
  • GCC/Clang :使用 file 命令查看二进制文件,输出包含 with debug info 即表示成功。
相关推荐
学嵌入式的小杨同学15 小时前
【Linux 封神之路】信号编程全解析:从信号基础到 MP3 播放器实战(含核心 API 与避坑指南)
java·linux·c语言·开发语言·vscode·vim·ux
酥暮沐15 小时前
iscsi部署网络存储
linux·网络·存储·iscsi
❀͜͡傀儡师16 小时前
centos 7部署dns服务器
linux·服务器·centos·dns
Dying.Light16 小时前
Linux部署问题
linux·运维·服务器
S190116 小时前
Linux的常用指令
linux·运维·服务器
小义_16 小时前
【RH134知识点问答题】第7章 管理基本存储
linux·运维·服务器
CSDN_RTKLIB16 小时前
【四个场景测试】源文件编码UTF-8 BOM
c++
小天源17 小时前
Error 1053 Error 1067 服务“启动后立即停止” Java / Python 程序无法后台运行 windows nssm注册器下载与报错处理
开发语言·windows·python·nssm·error 1053·error 1067
梁洪飞17 小时前
内核的schedule和SMP多核处理器启动协议
linux·arm开发·嵌入式硬件·arm
_运维那些事儿17 小时前
VM环境的CI/CD
linux·运维·网络·阿里云·ci/cd·docker·云计算