Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用cmake,如何确定每个生成类型的默认编译器标志?_Cmake - Fatal编程技术网

使用cmake,如何确定每个生成类型的默认编译器标志?

使用cmake,如何确定每个生成类型的默认编译器标志?,cmake,Cmake,我正在尝试配置我的生成系统,以便我的发布生成不包含额外的调试。但我在CMake文档中找不到任何地方列出了每个构建类型默认使用的编译器标志,我宁愿不发明自己的方法 此功能是否已经存在?在不诉诸试错的情况下,如何确定各种构建类型默认使用的标志?提供了一些有用的信息,并介绍了一些常见的反模式 CMake开箱即用的四种构建类型是Release、Debug、RelWithDebInfo和MinSizeRel。相应地,在CMake\u C\u FLAGS\u和CMake\u CXX\u FLAGS\u中,C

我正在尝试配置我的生成系统,以便我的发布生成不包含额外的调试。但我在CMake文档中找不到任何地方列出了每个构建类型默认使用的编译器标志,我宁愿不发明自己的方法

此功能是否已经存在?在不诉诸试错的情况下,如何确定各种构建类型默认使用的标志?

提供了一些有用的信息,并介绍了一些常见的反模式

CMake开箱即用的四种构建类型是
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选项进行检查。请参阅