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

rbl8hiat  于 2023-11-19  发布在  其他
关注(0)|答案(3)|浏览(294)

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

46scxncf

46scxncf1#

-g标志在内置缓存变量CMAKE_C_FLAGS_DEBUGCMAKE_CXX_FLAGS_DEBUGCMAKE_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

xam8gpfp

xam8gpfp2#

不幸的是,cmake does not support matching word boundaries使其在各种情况下都很健壮有点烦人。如果不小心,你很容易重复和/或错误地替换字符串中的(各种)-g。此外,cmake的regex引擎做了一些pretty stupid stuff when subgroupmatches are used(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}")

字符串

bqjvbblv

bqjvbblv3#

你试过https://cmake.org/cmake/help/latest/command/add_compile_options.html
尝试将add_compile_options(-ggdb3)添加到cmake中。

相关问题