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 即表示成功。
相关推荐
不会代码的小猴2 小时前
Linux环境编程第三天笔记
linux·笔记
~光~~2 小时前
【嵌入式linux学习】04_Pinctrl 和 GPIO子系统
linux·rk3588·嵌入式linux
IT WorryFree2 小时前
Git for Windows v2.52.0 发布说明
windows·git
点云SLAM2 小时前
C++(C++17/20)最佳工厂写法和SLAM应用综合示例
开发语言·c++·设计模式·c++实战·注册工厂模式·c++大工程系统
Q741_1472 小时前
C++ 队列 宽度优先搜索 BFS 力扣 662. 二叉树最大宽度 每日一题
c++·算法·leetcode·bfs·宽度优先
Galloping-Vijay2 小时前
解决 WSL2 + Windows Hosts + 开启 VPN 后无法访问本地 Web 服务的问题
前端·windows
csdn_aspnet2 小时前
C++跨平台开发:工程难题与解决方案深度解析
c++
475.352 小时前
linux-journal日志清理
linux·运维·服务器
weixin_438732102 小时前
ChromeDriver谷歌驱动下载
linux·chrome·selenium·自动化·mac·chrome devtools·chromedriver