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 即表示成功。
相关推荐
鹏大师运维3 小时前
为什么信创电脑装软件总提示“软件包架构不匹配”?
linux·运维·架构·国产化·麒麟·deb·统信uos
fqbqrr3 小时前
2606C++,C++构的多态
开发语言·c++
小欣加油4 小时前
leetcode56 合并区间
c++·算法·leetcode·职场和发展
Yolo_TvT5 小时前
C++:析构函数
c++
鹤落晴春5 小时前
【Linux复习】管理SELinux安全性
linux·运维·服务器
sun0077005 小时前
SniffMaster(读取苹果的ats文件) 和 wireshark
windows
yz_aiks5 小时前
Linux Jar包配置Systemd自启动实战:从排查到配置全流程
linux·python·jar·自启动·systemd
Hello:CodeWorld6 小时前
C 风格变参 vs C++ 变参模板:核心区别与选型指南
c语言·c++·算法
bjzhang757 小时前
CentOS下安装MySQL详解
linux·mysql·centos
Jason_chen8 小时前
Linux 6.2 音频机制深度解析:AI驱动的低延迟音频与零信任音频安全架构
linux