98

我只想调试一些在 Linux 上运行的代码,我需要一个调试版本(-O0 -ggdb)。所以我将这些东西添加到我的CMakeLists.txt

set(CMAKE_BUILD_TYPE DEBUG)
set(CMAKE_C_FLAGS "-O0 -ggdb")
set(CMAKE_C_FLAGS_DEBUG "-O0 -ggdb")
set(CMAKE_C_FLAGS_RELEASE "-O0 -ggdb")
set(CMAKE_CXX_FLAGS "-O0 -ggdb")
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -ggdb")
set(CMAKE_CXX_FLAGS_RELEASE "-O0 -ggdb")

当我尝试编译时,我打开了详细使用make VERBOSE=1 并且我观察了输出,就像这样

... /usr/bin/c++ -D_BSD_SOURCE **-O0 -ggdb** -Wnon-virtual-dtor 
-Wno-long-long -ansi -Wundef -Wcast-align -Wchar-subscripts -Wall -W 
-Wpointer-arith -Wformat-security -fno-exceptions -DQT_NO_EXCEPTIONS 
-fno-check-new -fno-common -Woverloaded-virtual -fno-threadsafe-statics 
-fvisibility=hidden -fvisibility-inlines-hidden **-g -O2** 
-fno-reorder-blocks -fno-schedule-insns -fno-inline ...

显然代码是用编译的"-g -O2",这不是我想要的。我怎样才能强制它只使用"-O0 -ggdb"

4

4 回答 4

94

您需要在 CMakeLists.txt 中的命令之后设置标志。project

此外,如果你调用include(${QT_USE_FILE})or add_definitions(${QT_DEFINITIONS}),你应该set在 Qt 之后包含这些命令,因为这些会附加更多的标志。如果这种情况,您可能只想将您的标志附加到 Qt 标志,因此更改为例如

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -ggdb")
于 2012-04-10T10:33:26.100 回答
26

对我来说最简单的解决方案是这样的:

export CFLAGS=-ggdb
export CXXFLAGS=-ggdb

CMake 会将它们附加到所有配置的标志中。只要确保清除 CMake 缓存即可。

于 2017-01-25T04:48:23.170 回答
17

您必须更改 cmake C/CXX 默认 FLAGS 。

根据CMAKE_BUILD_TYPE={DEBUG/MINSIZEREL/RELWITHDEBINFO/RELEASE} 放入主要CMakeLists.txt之一:

对于 C

set(CMAKE_C_FLAGS_DEBUG "put your flags")
set(CMAKE_C_FLAGS_MINSIZEREL "put your flags")
set(CMAKE_C_FLAGS_RELWITHDEBINFO "put your flags")
set(CMAKE_C_FLAGS_RELEASE "put your flags")

对于 C++

set(CMAKE_CXX_FLAGS_DEBUG "put your flags")
set(CMAKE_CXX_FLAGS_MINSIZEREL "put your flags")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "put your flags")
set(CMAKE_CXX_FLAGS_RELEASE "put your flags")

这将覆盖 CMakeCache.txt 中定义的值

于 2015-08-27T13:16:17.697 回答
7

在 Unix 系统上,对于几个项目,我将这些行添加到 CMakeLists.txt 中并且它编译成功,因为基本/usr/include)和本地包含(/usr/local/include)进入单独的目录:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I/usr/local/include -L/usr/local/lib")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I/usr/local/include")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L/usr/local/lib")

它附加正确的目录,包括 C 和 C++ 编译器标志的路径以及链接器标志的正确目录路径。

注意:C++编译器(c++)不支持-L,所以我们必须使用CMAKE_EXE_LINKER_FLAGS

于 2016-04-18T18:55:39.923 回答