【问题标题】:Change debug flag from -g to -ggdb3 using CMake使用 CMake 将调试标志从 -g 更改为 -ggdb3
【发布时间】:2021-07-20 20:02:21
【问题描述】:

考虑以下简单的 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

注意 -g 标志,它由 CMake 自动放置在那里以添加调试信息。

如何改为-ggdb3

【问题讨论】:

  • 相关问答,但我想现在有更好的方法可以做到这一点:stackoverflow.com/questions/10085945/…
  • 请注意 -g-ggdb3 大部分是等价的,除了后者记录宏定义(以一种非常低效的方式)。你为什么想要-ggdb3
  • 我正在将普通的 Makefile 移植到 CMake。那些 Makefile 有 -ggdb3 标志,这主要是原因。如果在 CMake 中变得难以做到,我可能最终会改用 -g 标志。

标签: c++ cmake gdb


【解决方案1】:

-g 标志自动设置在内置缓存变量 CMAKE_C_FLAGS_DEBUG CMAKE_CXX_FLAGS_DEBUG CMAKE_C_FLAGS_RELWITHDEBINFOCMAKE_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

【讨论】:

  • 它似乎不起作用:我在add_executable 调用之前设置了这两行(将CMAKE_C_FLAGS_DEBUG 替换为CMAKE_CXX_FLAGS_DEBUG),但-g 开关仍然存在,并且@ 987654332@ 不是。也许我做错了什么?
猜你喜欢
  • 1970-01-01
  • 2018-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-17
  • 2016-05-15
  • 1970-01-01
相关资源
最近更新 更多