考虑以下简单的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
?
3条答案
按热度按时间46scxncf1#
-g
标志在内置缓存变量CMAKE_C_FLAGS_DEBUG
CMAKE_CXX_FLAGS_DEBUG
CMAKE_C_FLAGS_RELWITHDEBINFO
和CMAKE_CXX_FLAGS_RELWITHDEBINFO
中自动设置,其中包含相应构建类型的默认编译选项。您可以根据需要替换和强制设置这些缓存变量。字符串
最后,您可能根本不需要使用
-ggdb3
。xam8gpfp2#
不幸的是,cmake does not support matching word boundaries使其在各种情况下都很健壮有点烦人。如果不小心,你很容易重复和/或错误地替换字符串中的(各种)
-g
。此外,cmake的regex引擎做了一些pretty stupid stuff when subgroupmatches are used(4年后找到你自己的未回答的错误报告总是一件很高兴的事-但至少我也提供了一个解决方案:)我还没有完全测试过,但这就是我现在使用的:
字符串
bqjvbblv3#
你试过https://cmake.org/cmake/help/latest/command/add_compile_options.html吗
尝试将
add_compile_options(-ggdb3)
添加到cmake中。