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 即表示成功。
相关推荐
Murphy_lx4 分钟前
1124. 表现良好的最长时间段
c++·算法
Android系统攻城狮32 分钟前
Linux Gstreamer深度解析之gst_audio_format_build_integer调用流程与实战(十二)
linux·运维·服务器·音视频·车载音视频·gstreamer进阶
吴声子夜歌1 小时前
Shell脚本——流程控制:for循环
linux·运维·shell
事圆则缓1 小时前
Ubuntu 安装与配置 Samba 服务器
linux·服务器·ubuntu
GeW1 小时前
每天2小时,21天闭环计划-RHCE通关时间表全公开
linux
luj_17682 小时前
一线一区一变破解人盯人防守密码
开发语言·网络·c++·经验分享·算法
广州山泉婚姻2 小时前
C/C++动态内存:堆内存的申请、使用与释放
c++·人工智能
weixin_450813532 小时前
pdf文档转为markdown文档
linux·pdf
自动化监测Learner3 小时前
Windows 自带搜索太慢?Everything 安装与使用指南,全盘文件秒搜
windows·everything
我的小卷呀3 小时前
Linux ip 命令底层逻辑与实战指南
linux·运维·c语言·网络协议·tcp/ip·网络安全