使用 CMake 将调试标志从 -g 更改为 -ggdb3

Bob*_*ane 6 c++ gdb cmake

考虑以下简单的 C++ 程序:

// main.cpp
#include <iostream>

int main()
{
    std::cout << "Hello World" << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我使用 CMake 为该项目生成 Makefile,然后使用 GNU Make 和 g++ 进行构建。我的CMakeLists.txt文件看起来像这样(实际上更复杂,这当然是简化的):

cmake_minimum_required(VERSION 3.20)
project(HelloWorld VERSION 1.0 LANGUAGES CXX)

add_executable(HelloWorld main.cpp)
Run Code Online (Sandbox Code Playgroud)

一切正常,但是在构建调试版本时:

cmake -DCMAKE_BUILD_TYPE=Debug ..
Run Code Online (Sandbox Code Playgroud)

我注意到使用的调试器标志是-g。当运行make VERBOSE=1查看使用了哪些标志时,编译时会显示以下内容main.cpp

[ 50%] Building CXX object CMakeFiles/HelloWorld.dir/main.cpp.o
/usr/bin/c++ -g -MD -MT CMakeFiles/HelloWorld.dir/main.cpp.o -MF CMakeFiles/HelloWorld.dir/main.cpp.o.d -o CMakeFiles/HelloWorld.dir/main.cpp.o -c /home/HelloWorld/main.cpp
Run Code Online (Sandbox Code Playgroud)

请注意-gCMake 自动放置的用于添加调试信息的标志。

我怎样才能将其更改-ggdb3为呢?

jia*_*zhe 0

标志-g自动设置在内置缓存变量CMAKE_C_FLAGS_DEBUG CMAKE_CXX_FLAGS_DEBUG CMAKE_C_FLAGS_RELWITHDEBINFO和中CMAKE_CXX_FLAGS_RELWITHDEBINFO,其中包含相应构建类型的默认编译选项。您可以根据需要替换并强制设置这些缓存变量。

string(REGEX REPLACE "\\b-g\\b" "-ggdb3" tmp_value "${CMAKE_C_FLAGS_DEBUG}")
set_property(CACHE CMAKE_C_FLAGS_DEBUG PROPERTY VALUE "${tmp_value}")
Run Code Online (Sandbox Code Playgroud)

最后,您实际上可能-ggdb3根本不需要使用。