使用CMake设置CFLAGS和CXXFLAGS选项

时间:2012-04-10 09:10:49

标签: cmake cflags

我只想调试在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 个答案:

答案 0 :(得分:64)

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

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

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -ggdb")

答案 1 :(得分:12)

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

根据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

中定义的值

答案 2 :(得分:7)

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

export CFLAGS=-ggdb
export CXXFLAGS=-ggdb

CMake会将它们附加到所有配置标志。

答案 3 :(得分:3)

在Unix系统上,对于多个项目,我将这些行添加到CMakeLists.txt中并且它已成功编译,因为 base / usr / include )和 local 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