gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 01:36:24 26 4
gpt4 key购买 nike

我正在尝试配置构建系统,以使发布的构建不包含额外的调试。但是我在CMake文档中找不到任何地方列出每个构建类型默认使用的编译器标志,因此我不想发明自己的处理方式。

该功能已经存在吗?在不求助于反复试验的情况下,如何确定默认情况下对各种构建类型使用哪些标志?

最佳答案

This blog post具有一些有用的信息,并且this post描述了一些常见的反模式。

CMake开箱即用包括的四种构建类型是ReleaseDebugRelWithDebInfoMinSizeRel。相应地,对于CMAKE_C_FLAGS_<buildType>CMAKE_CXX_FLAGS_<buildType>中每种已定义的构建类型,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 ++的标志集是相同的。)

注意,因为默认的构建类型是一个空字符串。因此,除非您指定构建类型,否则以上都不适用。在 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,因为它将破坏一些多配置生成器。 (最好将其设置在构建脚本中。)

(上述博客文章之一提倡在第一次调用 -DCMAKE_BUILD_TYPE=Debug时使用shell别名来设置 cmake。)

关于cmake - 使用cmake,如何确定每种构建类型的默认编译器标志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24767450/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com