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 即表示成功。
相关推荐
2401_892070981 天前
【Linux C++ 日志系统实战】LogFile 日志文件管理核心:滚动策略、线程安全与方法全解析
linux·c++·日志系统·日志滚动
美酒没故事°1 天前
Open WebUI安装指南。搭建自己的自托管 AI 平台
人工智能·windows·ai
yuzhuanhei1 天前
Visual Studio 配置C++opencv
c++·学习·visual studio
lwx9148521 天前
Linux-Shell算术运算
linux·运维·服务器
somi71 天前
ARM-驱动-02-Linux 内核开发环境搭建与编译
linux·运维·arm开发
双份浓缩馥芮白1 天前
【Docker】Linux 迁移 docker 目录(软链接)
linux·docker
不爱吃炸鸡柳1 天前
C++ STL list 超详细解析:从接口使用到模拟实现
开发语言·c++·list
十五年专注C++开发1 天前
RTTR: 一款MIT 协议开源的 C++ 运行时反射库
开发语言·c++·反射
‎ദ്ദിᵔ.˛.ᵔ₎1 天前
STL 栈 队列
开发语言·c++
黄昏晓x1 天前
Linux ---- UDP和TCP
linux·tcp/ip·udp