gpt4 book ai didi

c++ - 更改 CMAKE_CXX_FLAGS_DEBUG 和 CMake 中的 friend 的默认值

转载 作者:可可西里 更新时间:2023-11-01 17:39:06 25 4
gpt4 key购买 nike

我想在 CMake 中更改 CMAKE_CXX_FLAGS_RELEASECMAKE_CXX_FLAGS_DEBUG 的默认值。基本上,我有一些项目默认值与 CMake 的默认值略有不同(例如,发布),我不必问自己“哦,当添加 add_compile_options 时,他们的 -O3 或我们的 -O2 是否优先。”

现在,我知道如何设置这些值,但我不知道如何通过两种常用方式让用户可以编辑它们:通过在命令行上使用 -DCMAKE_CXX_FLAGS_DEBUG=yourflags 或通过使用 ccmake 或 CMakeSetup 配置它。

问题是 CMAKE 为这些设置和缓存了自己的默认值,如果您尝试在不使用 FORCE 的情况下覆盖变量,“默认值”永远不会改变。如果我在我的设置命令中使用 FORCE:set(CMAKE_CXX_FLAGS_DEBUG blah CACHE STRING ""FORCE),它会在每次运行脚本时覆盖它,从而消除了用户根据需要更改它的可能性.

我通过执行以下操作设法破解它以与 CCMAKE 一起工作,但这仍然不适用于 cmake -DCMAKE_CXX_FLAGS_DEBUG,因为它会在他完成后覆盖用户更改:

set(DEFAULTS_SET FALSE CACHE BOOL "")
set(CMAKE_CXX_FLAGS_DEBUG "-this -that" CACHE STRING "" FORCE)
set(DEFAULTS_SET TRUE CACHE BOOL "" FORCE)

显然,这是一个令人讨厌的 hack,并不完全有效(在 cmake -Dwhatever=thisorthat 的情况下)。我也可以添加其他构建类型,但我真的不明白为什么仅仅为了改变一些简单的事情就需要这样做。

2015 年 3 月 1 日编辑:

我已经创建了一个有效的解决方案,但我对我必须要做的事情仍然不是很兴奋。我看到其他评论解决了设置 CMAKE_CXX_FLAGS_DEBUG 和 friend 的问题,而没有让他们受到破坏,但这最初对我不起作用,因为我也试图根据编译器选择它们正在使用中。然而,编译器在它已经为我填充了变量之前是不确定的。我使用的技巧如下。您必须在项目命令之前将标志变量设置为“特殊”。

set(CMAKE_CXX_FLAGS_DEBUG "_UNSET" CACHE STRING "")
project(your_project C CXX)

if(${CMAKE_CXX_FLAGS_DEBUG} STREQUAL "_UNSET")
# Do some compiler switching here and then set your flags with FORCE.
set(CMAKE_CXX_FLAGS_DEBUG "-ggdb3 -O0" CACHE STRING "" FORCE)
endif()

这现在允许我选择默认值,这些默认值可以通过带有 -D 的命令行或在 cmake-gui 中完全覆盖。

最佳答案

我只想添加我看到的四种可能性:

  1. 拥有自己的工具链文件,其中包含您支持的每个编译器的预设,例如:

    GNUToolchain.cmake

     set(CMAKE_CXX_FLAGS_DEBUG "-ggdb3 -O0" CACHE STRING "")

    然后使用它

     cmake -DCMAKE_TOOLCHAIN_FILE:string=GNUToolchain.cmake ...
  2. 您可以尝试通过检查CMAKE_GENERATOR 来确定编译器。 (在 project() 命令之前有效):

    CMakeLists.txt

     if("${CMAKE_GENERATOR}" MATCHES "Makefiles" OR 
    ("${CMAKE_GENERATOR}" MATCHES "Ninja" AND NOT WIN32))
    set(CMAKE_CXX_FLAGS_DEBUG "-ggdb3 -O0" CACHE STRING "")
    endif()

    project(your_project C CXX)
  3. 您可以使用 CMAKE_USER_MAKE_RULES_OVERRIDE为脚本提供您自己的 ..._INIT 值:

    It is loaded after CMake’s builtin compiler and platform information modules have been loaded but before the information is used. The file may set platform information variables to override CMake’s defaults.

    MyInitFlags.cmake

     # Overwrite the init values choosen by CMake
    if (CMAKE_CXX_COMPILER_ID MATCHES "GNU")
    set(CMAKE_CXX_FLAGS_DEBUG_INIT "-ggdb3 -O0")
    endif()

    CMakeLists.txt

     set(CMAKE_USER_MAKE_RULES_OVERRIDE "MyInitFlags.cmake")

    project(your_project C CXX)
  4. 从 3 月 1 日起,您可以通过检查编译器标志变量的 ..._INIT 变体来简化您的解决方案:

    CMakeLists.txt

     project(your_project C CXX)

    if (DEFINED CMAKE_CXX_FLAGS_DEBUG_INIT AND
    "${CMAKE_CXX_FLAGS_DEBUG_INIT}" STREQUAL "${CMAKE_CXX_FLAGS_DEBUG}")
    # Overwrite the init values choosen by CMake
    if (CMAKE_CXX_COMPILER_ID MATCHES "GNU")
    set(CMAKE_CXX_FLAGS_DEBUG "-ggdb3 -O0" CACHE STRING "" FORCE)
    endif()
    endif()

评论:

我更喜欢并使用工具链变体。但我承认它的缺点是必须手动提供工具链文件(如果您不是通过脚本/批处理文件调用 cmake)。

引用:

关于c++ - 更改 CMAKE_CXX_FLAGS_DEBUG 和 CMake 中的 friend 的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28732209/

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