Windows下CMake项目如何获取Visual Studio默认PlatformToolset信息?
获取Visual Studio默认PlatformToolset并追加到库文件名
在CMake中,无需完全依赖手动映射MSVC_VERSION,有两种可靠方式获取默认工具集信息:
方法1:直接查询Visual Studio默认工具集
CMake提供cmake_host_system_information命令,可以直接获取当前Visual Studio生成器对应的默认工具集,无需手动维护版本对应关系:
if(MSVC) # 处理生成器名称,将空格替换为下划线以适配查询格式 string(REPLACE " " "_" generator_name_underscore "${CMAKE_GENERATOR}") # 查询当前VS生成器的默认工具集 cmake_host_system_information(RESULT default_toolset QUERY VS_${generator_name_underscore}_DEFAULT_TOOLSET) # 优先使用用户指定的工具集,否则用默认值 set(target_toolset "${CMAKE_GENERATOR_TOOLSET}") if(NOT target_toolset) set(target_toolset "${default_toolset}") endif() # 将工具集信息追加到共享库文件名 set_target_properties(your_shared_library_target PROPERTIES OUTPUT_NAME "your_lib_name_${target_toolset}" # 如需区分Debug/Release,可结合CMAKE_BUILD_TYPE扩展 # DEBUG_OUTPUT_NAME "your_lib_name_${target_toolset}_d" ) endif()
这种方法的优势是准确且无需手动更新,CMake会直接读取Visual Studio的默认配置,避免版本映射出错。
方法2:基于MSVC_VERSION映射工具集(兼容 fallback)
如果你的CMake版本较旧,不支持cmake_host_system_information的VS工具集查询,可以通过MSVC_VERSION与工具集的固定对应关系手动映射,这是兼容性更强的方案:
if(MSVC) set(target_toolset "${CMAKE_GENERATOR_TOOLSET}") if(NOT target_toolset) # 根据MSVC_VERSION映射默认工具集 if(MSVC_VERSION EQUAL 1900) set(target_toolset "v140") # VS2015 elseif(MSVC_VERSION EQUAL 1910) set(target_toolset "v141") # VS2017 elseif(MSVC_VERSION EQUAL 1920) set(target_toolset "v142") # VS2019 elseif(MSVC_VERSION GREATER_EQUAL 1930) set(target_toolset "v143") # VS2022及后续版本 endif() endif() # 应用到库文件名 set_target_properties(your_shared_library_target PROPERTIES OUTPUT_NAME "your_lib_name_${target_toolset}" ) endif()
需要注意的是,后续Visual Studio新版本发布时,需要手动添加对应的MSVC_VERSION映射项。
内容的提问来源于stack exchange,提问作者moudi
相关产品推荐
相关产品推荐

