【问题标题】:Visual Studio: ToolsVersion vs PlatformToolset. Do they need to correspond?Visual Studio:ToolsVersion 与 PlatformToolset。他们需要对应吗?
【发布时间】:2022-01-12 06:03:47
【问题描述】:

MSDN documentation 说您需要使用与 Platform Toolset 版本对应的运行时版本,否则会导致 UB。
我有一个已迁移到 Visual Studio 2019 的旧项目,并且有一个 <PlatformToolset>v142</PlatformToolset><Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
我知道应该有 CMake 生成的ToolsVersion="Current"ToolsVersion="16.0"
在构建项目时,我没有收到来自 Visual Studio 的警告,但我担心指定不兼容的版本是否会导致链接错误的 CRT 版本。

当我使用/MD 构建时,似乎一切正常:

  Image has the following dependencies:

    msi.dll
    MSVCP140D.dll
    VCRUNTIME140D.dll
    VCRUNTIME140_1D.dll
    ucrtbased.dll
    KERNEL32.dll

但旧项目使用/MT,我无法从dumpbin 输出的.obj 文件中确定使用了哪个CRT:

   Linker Directives
   -----------------
   /FAILIFMISMATCH:_MSC_VER=1900
   /FAILIFMISMATCH:_ITERATOR_DEBUG_LEVEL=2
   /FAILIFMISMATCH:RuntimeLibrary=MTd_StaticDebug
   /DEFAULTLIB:libcpmtd
   /FAILIFMISMATCH:_CRT_STDIO_ISO_WIDE_SPECIFIERS=0
   /DEFAULTLIB:uuid.lib
   /DEFAULTLIB:uuid.lib
   /DEFAULTLIB:LIBCMTD
   /DEFAULTLIB:OLDNAMES

ToolsVersion 是否有意义,它会导致链接错误的 CRT 版本吗?
我如何检查使用 /MT 编译时链接的运行时版本? em>


来自关于binary compatibility的页面:

您可以混合使用不同版本的 v140、v141、v142 和 v143 工具集构建的二进制文件。但是,您必须使用至少与应用程序中最新的二进制文件一样新的工具集进行链接。这是一个示例:您可以将使用任何 2017 工具集(v141,版本 15.0 到 15.9)编译的应用链接到使用例如 Visual Studio 2019 版本 16.2 (v142) 编译的静态库。您只需使用 16.2 或更高版本的工具集来链接它们。只要您使用 16.4 或更高版本的工具集,就可以将 16.2 版库链接到 16.4 版应用。

所以我担心的是一些使用ToolsVersion="4.0" 构建的库,它们与v140..v142 版本构建的二进制文件不兼容。
因此,问题是:如果使用 4.0 ToolsVersion 而不是 v141 PlatformToolset 的 15.0 版,会发生什么不好的事情吗?

【问题讨论】:

    标签: c++ visual-studio visual-c++ linker


    【解决方案1】:

    ToolsVersionoptional 属性,仅由 msbuild 使用。 它是 MSBuild 工具集的版本,用于 determine $(MSBuildBinPath)$(MSBuildToolsPath) 的值。 您可以放心地忽略此属性,它不会影响您的 ABI。

    【讨论】:

    • 省略是指将其从 xml 中删除或保持原样 4.0?
    • 完全删除
    • 好的,但问题是“当它存在并且不对应时它是否会影响ABI”。另外,通过命令行msbuild.exe构建解决方案后,如何查看MSBuild如何解决$(MSBuildToolsPath)$(MSBuildToolsPath)
    猜你喜欢
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    相关资源
    最近更新 更多