gpt4 book ai didi

cmake - 在带有子项目的项目中的哪里设置CMAKE_CONFIGURATION_TYPES

转载 作者:行者123 更新时间:2023-12-03 13:46:27 25 4
gpt4 key购买 nike

可以说我有一个包含两个独立子项目的项目。如果我正确理解了cmake,则想法是先定义一个CMakeLists.txt的根project(...),然后使用add_subdirectory(...)包含子项目。每个子项目都有自己的CMakeLists.txt,用于定义自己的项目。这样,可以一起(使用根cmake文件)或单独(使用子项目cmake文件)构建项目。

我现在想更改CMAKE_CONFIGURATION_TYPES。我应该在CMakeLists.txt根目录下还是在每个子项目中?

在根目录中更改它意味着单独构建一个子项目将提供错误的配置类型。其他选项将复制cmake代码。我想我在这里错过了一些东西。

最佳答案

分解出用于设置与配置相关的设置的代码。创建具有以下内容的文件,例如SetUpConfigurations.cmake:

if(NOT SET_UP_CONFIGURATIONS_DONE)
set(SET_UP_CONFIGURATIONS_DONE TRUE)

# No reason to set CMAKE_CONFIGURATION_TYPES if it's not a multiconfig generator
# Also no reason mess with CMAKE_BUILD_TYPE if it's a multiconfig generator.
get_property(isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
if(isMultiConfig)
set(CMAKE_CONFIGURATION_TYPES "Debug;Release;Profile" CACHE STRING "" FORCE)
else()
if(NOT CMAKE_BUILD_TYPE)
message("Defaulting to release build.")
set(CMAKE_BUILD_TYPE Release CACHE STRING "" FORCE)
endif()
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY HELPSTRING "Choose the type of build")
# set the valid options for cmake-gui drop-down list
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug;Release;Profile")
endif()
# now set up the Profile configuration
set(CMAKE_C_FLAGS_PROFILE "...")
set(CMAKE_CXX_FLAGS_PROFILE "...")
set(CMAKE_EXE_LINKER_FLAGS_PROFILE "...")
endif()

然后在 include(..)的开头 CMakeLists.txt这个文件。

关于将 SetUpConfigurations.cmake放在何处,您有两种选择,这取决于您如何组织项目,存储库:
  • 快速“肮脏”的方式:复制该脚本并将其提交到需要它的每个项目中。相对于项目的CMakeLists.txt,它的位置将是固定的。因此,您可以将其包含在例如include(${CMAKE_CURRENT_SOURCE_DIR}/<...>/SetUpConfigurations.cmake)
  • 训练有素的方法:使用您的自定义CMake脚本维护一个存储库,就像这样。每次使用cmake命令生成项目时,都将路径传递到CMAKE_MODULE_PATH变量中的此存储库:
    cmake -DCMAKE_MODULE_PATH=<dir-of-cmake-script-repo> ...

  • 在这种情况下,请包括带有 include(SetUpConfigurations)(无 .cmake扩展名)的脚本。

    关于什么是multiconfig生成器的说明:
    XcodeVisual Studio是multiconfig生成器。它们尊重 CMAKE_CONFIGURATION_TYPES的值,但是 CMAKE_BUILD_TYPE无效,因为在处理 CMakeLists.txt时未定义任何具体配置。稍后将在IDE的用户界面上选择它。

    另一方面,makefile样式的生成器对 CMAKE_CONFIGURATION_TYPES不感兴趣。 CMAKE_BUILD_TYPE定义配置。处理 CMakeLists.txt文件时,这是一个具体的值,但仍然:永远不要根据 CMAKE_BUILD_TYPE的值做出任何决定:
    if(CMAKE_BUILD_TYPE STREQUAL "Release") # WRONG!
    ....
    endif()

    您的项目将无法在multiconfig生成器中正常工作。

    关于cmake - 在带有子项目的项目中的哪里设置CMAKE_CONFIGURATION_TYPES,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31546278/

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