cmake_minimum_required所需的版本如何影响生成的文件?

mrfwxfqh  于 2022-11-11  发布在  其他
关注(0)|答案(2)|浏览(162)

我遇到了一个奇怪的行为,更改cmake_minimum_required会影响CMake生成的面向Visual Studio 2019的文件。根据cmake_minimum_requiredthe doc
如果正在运行的CMake版本低于所需版本,它将停止处理项目并报告错误
所以它只是用来中断项目生成。
但是,如果我创造:

主文件.cpp

int main()
{

# ifndef _DEBUG

# error "DEBUG flag not set"

# endif

    return 0;
}

CMakeLists.txt中的一个或多个文件:

cmake_minimum_required(VERSION 2.8.12)

project(hello_world)

set( CMAKE_CONFIGURATION_TYPES "Debug;Release;MyDebug" CACHE INTERNAL "" FORCE )
set( CMAKE_CXX_FLAGS_MYDEBUG "${CMAKE_CXX_FLAGS_DEBUG}" )
set( CMAKE_C_FLAGS_MYDEBUG "${CMAKE_C_FLAGS_DEBUG}" )
set( CMAKE_EXE_LINKER_FLAGS_MYDEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG}" )
set( CMAKE_SHARED_LINKER_FLAGS_MYDEBUG "${CMAKE_SHARED_LINKER_FLAGS_DEBUG}" )
set_property( GLOBAL PROPERTY DEBUG_CONFIGURATIONS "Debug;MyDebug" )

add_executable(app main.cpp)

如果我使用CMake 3.24.1 for Visual Studio 2019生成此项目,则它将使用MyDebug配置正确构建,因为_DEBUG编译标志已正确设置。
但是,如果我将cmake_minimum_required(VERSION 2.8.12)更改为cmake_minimum_required(VERSION 3.24.1),则它将无法生成,并报告DEBUG flag not set,这意味着不再设置_DEBUG编译标志。
当我检查vcproj文件时,我发现对于MyDebug<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>已更改为<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
这是一个CMake错误还是我做错了什么?

yyyllmsg

yyyllmsg1#

所以它只是用来中断项目生成。
根本不是这样的!
cmake_minimum_required将您的项目置于与指定版本一致的 * 向后兼容 * 模式。该文档的“策略设置”一节讨论了这一点。现在有一组超过100个CMake策略,可以对系统进行突破性的改进。您可以在这里看到完整的列表:https://cmake.org/cmake/help/latest/manual/cmake-policies.7.html
这里的相关策略是在CMake 3.15中引入的CMP0091
CMake 3.15和更高版本倾向于不使用MSVC运行时库选择标志的默认值CMAKE_<LANG>_FLAGS_<CONFIG>,而是提供一个第一级抽象。可以设置CMAKE_MSVC_RUNTIME_LIBRARY变量和MSVC_RUNTIME_LIBRARY目标属性来选择MSVC运行时库。如果没有设置它们,CMake将使用默认值MultiThreaded$<$<CONFIG:Debug>:Debug>DLL,这与原始标志等效。
因此,要将项目升级到CMake 3.15以上的版本,只需覆盖CMakeLists.txt文件顶部附近的默认值CMAKE_MSVC_RUNTIME_LIBRARY

set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug,MyDebug>:Debug>DLL"
    CACHE STRING "Rule for selecting MSVC runtime")

这将使用$<CONFIG>生成器表达式为您的自定义MyDebug配置启用调试运行时。

wgmfuz8q

wgmfuz8q2#

当然,cmake可以随着它的进化而改变行为。
随着CMake的发展,有时需要更改现有的行为,以修复错误或改进现有功能的实现。*
如果它只是在新版本中改变了一些行为,那么它引入了一个策略,可以显式地切换cmake以使用旧的行为。策略的旧行为将被定义为不推荐使用,并且可能会在CMake的未来版本中被删除。
查看cmake-policies(7)列表中的变化。你也可以设置cmake_minimum_required,每次增加一个主版本号,运行cmake,看看在cmake dump中引入了什么策略。其中之一是改变RuntimeLibrary_DEBUG的行为。

相关问题