【发布时间】: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