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

问题描述 投票:0回答:3

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

// main.cpp
#include <iostream>

int main()
{
    std::cout << "Hello World" << std::endl;
    return 0;
}

我使用 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)

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

cmake -DCMAKE_BUILD_TYPE=Debug ..

我注意到使用的调试器标志是

-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

注意 CMake 自动放置的

-g
标志以添加调试信息。

如何将其更改为

-ggdb3

c++ cmake gdb
3个回答
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}")

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

-ggdb3


0
投票

不幸的是,cmake 不支持匹配单词边界,因此使其在各种情况下都具有鲁棒性有点烦人。如果不小心,您很容易会重复和/或错误地替换字符串中的(各种)

-g
。另外,当使用子组匹配时,cmake 的正则表达式引擎会做一些非常愚蠢的事情(4 年后找到自己未答复的错误报告总是很高兴 - 但至少我也提供了一个解决方法:) 我还没有对此进行彻底的测试,但这就是我现在正在使用的:

string(REGEX MATCH "^(.* )?-g( .*)?$" dummy "${CMAKE_C_FLAGS_DEBUG}") set_property(CACHE CMAKE_C_FLAGS_DEBUG PROPERTY VALUE "${CMAKE_MATCH_1}-ggdb3 -gdwarf-5 -Og${CMAKE_MATCH_2}")



0
投票
https://cmake.org/cmake/help/latest/command/add_compile_options.html

尝试添加 add_compile_options(-ggdb3)

© www.soinside.com 2019 - 2024. All rights reserved.