This blog post有一些有用的信息,this post描述了一些常见的反模式。 CMake包含的四种构建类型是Release,Debug,RelWithDebInfo和MinSizeRel。相应地,CMake为CMAKE_C_FLAGS_<buildType>和CMAKE_CXX_FLAGS_<buildType>中定义的每个构建类型提供默认值。 如果你想知道每种构建类型的默认值是什么,你可以在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
// Flags used by the CXX compiler during all build types.
CMAKE_CXX_FLAGS:STRING=
// Flags used by the CXX compiler during DEBUG builds.
CMAKE_CXX_FLAGS_DEBUG:STRING=-g
// Flags used by the CXX compiler during MINSIZEREL builds.
CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG
// Flags used by the CXX compiler during RELEASE builds.
CMAKE_CXX_FLAGS_RELEASE:STRING=-O3 -DNDEBUG
// Flags used by the CXX compiler during RELWITHDEBINFO builds.
CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG
2条答案
按热度按时间vom3gejh1#
This blog post有一些有用的信息,this post描述了一些常见的反模式。
CMake包含的四种构建类型是
Release
,Debug
,RelWithDebInfo
和MinSizeRel
。相应地,CMake为CMAKE_C_FLAGS_<buildType>
和CMAKE_CXX_FLAGS_<buildType>
中定义的每个构建类型提供默认值。如果你想知道每种构建类型的默认值是什么,你可以在
CMakeLists.txt
中添加以下语句:在我的
cmake
版本(OS X上的cmake版本2.8.12.1)上,这将打印以下值:(as你可以看到,默认情况下,C和C++的标志集是相同的。)
请小心,因为默认的构建类型是 * 空字符串 *。因此,除非您指定构建类型,否则上述内容都不适用。在cmake mailing list上,建议使用以下代码(我想应该放在顶级
CMakeLists.txt
的顶部附近),以供那些不希望这种行为的人使用:但是,这是not recommended,因为它会破坏一些多配置生成器(最好在构建脚本中设置它)。
(One在上面的博客文章中,有50%主张在第一次调用
cmake
时使用shell别名来设置-DCMAKE_BUILD_TYPE=Debug
。)t3psigkw2#
您还可以:
如:How to list all CMake build options and their default values?这给出:
还要注意:
-DMAKE_BUILD_TYPE
,则CMAKE_BUILD_TYPE
为空,并且不添加任何额外的CMAKE_CXX_FLAGS_XXX
值,因此根本不传递任何标志-O0
与mangcc
相同,这是对未指定的构建类型(即DEBUG
)生效的级别make VERBOSE=1
为每个感兴趣的构建类型进行详细构建,其中显示了完整的GCC CLI,例如:并输出如下内容:
如以下网址所述:How do I force make/GCC to show me the commands?
在Ubuntu 22.10,CMake 3.24.2上测试。