我遇到了一个奇怪的行为,更改cmake_minimum_required
会影响CMake
生成的面向Visual Studio 2019的文件。根据cmake_minimum_required
的the 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
错误还是我做错了什么?
2条答案
按热度按时间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
:这将使用
$<CONFIG>
生成器表达式为您的自定义MyDebug
配置启用调试运行时。wgmfuz8q2#
当然,
cmake
可以随着它的进化而改变行为。随着CMake的发展,有时需要更改现有的行为,以修复错误或改进现有功能的实现。
*
如果它只是在新版本中改变了一些行为,那么它引入了一个策略,可以显式地切换cmake以使用旧的行为。策略的旧行为将被定义为不推荐使用,并且可能会在CMake的未来版本中被删除。
查看cmake-policies(7)列表中的变化。你也可以设置
cmake_minimum_required
,每次增加一个主版本号,运行cmake,看看在cmake dump中引入了什么策略。其中之一是改变RuntimeLibrary
和_DEBUG
的行为。