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

uurv41yg  于 2023-04-12  发布在  其他
关注(0)|答案(2)|浏览(191)

我正在尝试配置我的构建系统,以便我的发布版本不包含额外的调试。但我在CMake文档中找不到任何地方列出每个构建类型默认使用哪些编译器标志,我宁愿不发明自己的方法来做事情。
这个功能已经存在了吗?如果不诉诸试验和错误,我如何确定默认情况下为各种构建类型使用哪些标志?

vom3gejh

vom3gejh1#

This blog post有一些有用的信息,this post描述了一些常见的反模式。
CMake包含的四种构建类型是ReleaseDebugRelWithDebInfoMinSizeRel。相应地,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

(as你可以看到,默认情况下,C和C++的标志集是相同的。)
请小心,因为默认的构建类型是 * 空字符串 *。因此,除非您指定构建类型,否则上述内容都不适用。在cmake mailing list上,建议使用以下代码(我想应该放在顶级CMakeLists.txt的顶部附近),以供那些不希望这种行为的人使用:

if (NOT CMAKE_BUILD_TYPE)
    message(STATUS "No build type selected, default to Release")
    set(CMAKE_BUILD_TYPE "Release")
endif()

但是,这是not recommended,因为它会破坏一些多配置生成器(最好在构建脚本中设置它)。
(One在上面的博客文章中,有50%主张在第一次调用cmake时使用shell别名来设置-DCMAKE_BUILD_TYPE=Debug。)

t3psigkw

t3psigkw2#

您还可以:

  • 列出所有内置变量并grep感兴趣的变量:
cmake -LAH .. | grep -C1 CMAKE_CXX_FLAGS

如:How to list all CMake build options and their default values?这给出:

// 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

还要注意:

  • 默认情况下,如果不传递-DMAKE_BUILD_TYPE,则CMAKE_BUILD_TYPE为空,并且不添加任何额外的CMAKE_CXX_FLAGS_XXX值,因此根本不传递任何标志
  • 默认的GCC优化级别,如果-O0与man gcc相同,这是对未指定的构建类型(即DEBUG)生效的级别
  • 使用make VERBOSE=1为每个感兴趣的构建类型进行详细构建,其中显示了完整的GCC CLI,例如:
rm -rf build
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Debug ..
make VERBOSE=1

并输出如下内容:

/usr/bin/cc -g -MD -MT CMakeFiles/main.dir/main.c.o -MF CMakeFiles/main.dir/main.c.o.d -o CMakeFiles/main.dir/main.c.o -c /home/ciro/cmake/option/main.c

如以下网址所述:How do I force make/GCC to show me the commands?
在Ubuntu 22.10,CMake 3.24.2上测试。

相关问题