使用cmake,如何确定每个生成类型的默认编译器标志?
我正在尝试配置我的生成系统,以便我的发布生成不包含额外的调试。但我在CMake文档中找不到任何地方列出了每个构建类型默认使用的编译器标志,我宁愿不发明自己的方法 此功能是否已经存在?在不诉诸试错的情况下,如何确定各种构建类型默认使用的标志?提供了一些有用的信息,并介绍了一些常见的反模式 CMake开箱即用的四种构建类型是使用cmake,如何确定每个生成类型的默认编译器标志?,cmake,Cmake,我正在尝试配置我的生成系统,以便我的发布生成不包含额外的调试。但我在CMake文档中找不到任何地方列出了每个构建类型默认使用的编译器标志,我宁愿不发明自己的方法 此功能是否已经存在?在不诉诸试错的情况下,如何确定各种构建类型默认使用的标志?提供了一些有用的信息,并介绍了一些常见的反模式 CMake开箱即用的四种构建类型是Release、Debug、RelWithDebInfo和MinSizeRel。相应地,在CMake\u C\u FLAGS\u和CMake\u CXX\u FLAGS\u中,C
Release
、Debug
、RelWithDebInfo
和MinSizeRel
。相应地,在CMake\u C\u FLAGS\u和CMake\u CXX\u FLAGS\u中,CMake为每个定义的构建类型提供默认值
如果要了解每种生成类型的默认值,可以将以下语句添加到CMakeLists.txt
:
message("CMAKE_C_FLAGS_DEBUG is ${CMAKE_C_FLAGS_DEBUG}")
message("CMAKE_C_FLAGS_RELEASE is ${CMAKE_C_FLAGS_RELEASE}")
message("CMAKE_C_FLAGS_RELWITHDEBINFO is ${CMAKE_C_FLAGS_RELWITHDEBINFO}")
message("CMAKE_C_FLAGS_MINSIZEREL is ${CMAKE_C_FLAGS_MINSIZEREL}")
message("CMAKE_CXX_FLAGS_DEBUG is ${CMAKE_CXX_FLAGS_DEBUG}")
message("CMAKE_CXX_FLAGS_RELEASE is ${CMAKE_CXX_FLAGS_RELEASE}")
message("CMAKE_CXX_FLAGS_RELWITHDEBINFO is ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
message("CMAKE_CXX_FLAGS_MINSIZEREL is ${CMAKE_CXX_FLAGS_MINSIZEREL}")
在我的cmake
(OS X上的cmake 2.8.12.1版)版本上,这将打印以下值:
CMAKE_C_FLAGS_DEBUG is -g
CMAKE_C_FLAGS_RELEASE is -O3 -DNDEBUG
CMAKE_C_FLAGS_RELWITHDEBINFO is -O2 -g -DNDEBUG
CMAKE_C_FLAGS_MINSIZEREL is -Os -DNDEBUG
CMAKE_CXX_FLAGS_DEBUG is -g
CMAKE_CXX_FLAGS_RELEASE is -O3 -DNDEBUG
CMAKE_CXX_FLAGS_RELWITHDEBINFO is -O2 -g -DNDEBUG
CMAKE_CXX_FLAGS_MINSIZEREL is -Os -DNDEBUG
(如您所见,默认情况下,C和C++的标志集相同)
请小心,因为默认生成类型是空字符串。因此,除非您指定生成类型,否则上述内容都不适用。对于那些不希望这种行为的人,建议使用以下代码(我想应该放在顶级的
CMakeLists.txt
)的顶部附近:
if (NOT CMAKE_BUILD_TYPE)
message(STATUS "No build type selected, default to Release")
set(CMAKE_BUILD_TYPE "Release")
endif()
然而,这是因为它会破坏一些多配置生成器。(最好在构建脚本中设置它。)
(上面的一篇博文主张在第一次调用cmake
时使用shell别名设置-DCMAKE\u BUILD\u TYPE=Debug
)您提到的所有博文以及您的答案本身(if(不是cmake\u BUILD\u TYPE)
部分)对于多配置生成器都不起作用。请看我的文章,它本身包含一些反模式,比如在源代码中构建(cmake.
),通过add_definitions命令(`add_definitions(-Wall-std=c++0x)`)设置编译器标志,以及重写用户定义标志(set(cmake_CXX_flags“-std=c++0x-Wall”)@ruslo,谢谢。我将编辑我的答案,以明确检查是否定义了构建类型不是一个可移植的解决方案。(我链接到这些帖子以表示信任,因为部分答案是复制/粘贴然后扩展的。)@ruslo,没错,但我指的是无污染的默认值;-)通过这样的传递,他们或者意外地污染了它,或者故意定制了它……如果您想检查cmake默认标志,您可以在/usr/share/cmake-/Modules/Compiler/GNU.cmake文件中看到它们。这是否回答了您的问题@MarineGalantin:CMAKE\u C\u FLAGS\u DEBUG
之类的变量不是缓存的变量,因此无法通过CMAKE-LA
或其他CMAKE选项进行检查。请参阅