使用CMake设置CFLAGS和CXXFLAGS选项

maj*_*jie 73 cmake cflags

我只想调试在Linux上运行的一些代码,我需要一个debug build(-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")
Run Code Online (Sandbox Code Playgroud)

当我尝试编译时,我在使用时变得冗长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 ...
Run Code Online (Sandbox Code Playgroud)

显然代码是用编译的"-g -O2",这不是我想要的.我怎么能强迫它只使用"-O0 -ggdb"

Fra*_*ser 71

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

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

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -ggdb")
Run Code Online (Sandbox Code Playgroud)


小智 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")
Run Code Online (Sandbox Code Playgroud)

对于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")
Run Code Online (Sandbox Code Playgroud)

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


Vir*_*s_7 9

最适合我的最简单的解决方案是:

export CFLAGS=-ggdb
export CXXFLAGS=-ggdb
Run Code Online (Sandbox Code Playgroud)

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

  • 像这样在环境中设置标志是在不修改 CMakeLists.txt 的情况下执行此操作的唯一方法。请注意,环境值仅在第一次配置时读取,然后放入缓存中,因此如果您想更改此设置,则需要清除 CMake 缓存并使用环境中的新值重新运行配置步骤。文档:https://cmake.org/cmake/help/latest/envvar/CFLAGS.html https://cmake.org/cmake/help/latest/envvar/CXXFLAGS.html (7认同)
  • 这不是“最简单的”,这是唯一正确的方法。 (5认同)
  • 小问题是,如果生成器正在为特定构建类型配置特定标志(例如在“CMAKE_CXX_FLAGS_DEBUG”等中),则将其包含在“CXXFLAGS”中(从而将其注入“CMAKE_CXX_FLAGS”)实际上不足以通过编译器的选项。每个构建类型的配置优先于用户输入。 (2认同)

sbz*_*sbz 6

在 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")
Run Code Online (Sandbox Code Playgroud)

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

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

  • 使用 `include_directories` 代替 `-I` 标志不是更好吗? (3认同)