cmake CFLAGS CXXFLAGS修改

我只是想debugging一些在Linux上运行的代码,我需要一个debugging版本( -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"

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

另外,如果你调用include(${QT_USE_FILE})add_definitions(${QT_DEFINITIONS}) ,你应该在Qt之后包含这些set命令,因为这些命令会附加更多的标志。 如果是这样的话,你可能只想把你的标志附加到Qt的标志上,所以改成例如

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

您必须更改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中定义的值

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

 export CFLAGS=-ggdb export CXXFLAGS=-ggdb 

CMake会将它们追加到所有configuration标志。

在Unix系统上,对于几个项目,我将这些行添加到CMakeLists.txt中,并且由于base/ usr / include )和local包含( / 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 ++编译器标志的path和链接器标志的正确目录path。

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

Interesting Posts