目录
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)
2.2.使用CMake的add_compile_options和add_link_options
你也可以使用add_compile_options和add_link_options来添加编译和连接选项。
cpp
if(MSVC)
add_compile_option($<$CONFIG:Release>:/Zi>)
add_link_options($<$CONFIG:Release>:/DEBUG)
endif()
2.3.使用CMake的target_compile_options和target_link_options
如果你只想针对特定的目标使用这些选项,可以使用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即表示成功。