错误 MSB8024:不支持使用静态版本的 C++ 运行时库

Posted

技术标签:

【中文标题】错误 MSB8024:不支持使用静态版本的 C++ 运行时库【英文标题】:error MSB8024: Using static version of the C++ runtime library is not supported 【发布时间】:2018-06-01 18:45:19 【问题描述】:

我使用 Visual Studio 模板创建了简单的 Windows 运行时组件。默认情况下,项目通过 MD/MDd 选项动态链接到 C/C++ 运行时库。

当我将其更改为 MT/MTd(项目属性 -> C/C++ -> 代码生成 -> 运行时库)并构建项目时出现错误

1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets\Microsoft.CppBuild.targets(1693,5):错误 MSB8024:使用 C++ 的静态版本不支持运行时库。

如何使用 MTd 选项编译 Windows 运行时组件? 我需要这个,因为 WinRT 组件将引用其他使用静态链接 C++ 运行时库构建的第 3 部分库。

【问题讨论】:

错误信息非常明确,没有可以按下的魔法按钮使其消失。必须重建库以匹配编译器版本和设置是完全正常的。如果不是您的,请要求所有者进行重建。请记住,这样的库不太可能在 UWP 应用程序中运行,因此必须使用 WACK 对其进行验证。 解决方案是请求第 3 方库的版本,该版本动态链接到您在组件中使用的同一 CRT。 【参考方案1】:

很遗憾,您无法避免限制。

但我怀疑“我需要这个,因为 WinRT 组件将引用其他使用静态链接 C++ 运行时库构建的第 3 部分库”。您是否尝试使用该第 3 部分库?将它添加到项目中应该没有问题。

【讨论】:

我只能在使用 MD 标志重新编译后才能使用 3rd 方库,否则会出现编译错误。顺便说一句,您知道添加此类限制是否有特定原因? .NET Framework 出于某种原因需要它。另请查看***.com/questions/564872/… @miradham:针对 CRT 的静态链接会施加不适当的限制。有关详细信息,请参阅Potential Errors Passing CRT Objects Across DLL Boundaries,为什么您总是希望动态链接到 CRT。并且始终链接到同一个 CRT。 或者只是不要跨 DLL 边界传递 CRT 对象;) 这不是您可以控制的。已经做出决定的是第 3 方库。事后你无法改变。

以上是关于错误 MSB8024:不支持使用静态版本的 C++ 运行时库的主要内容,如果未能解决你的问题,请参考以下文章

npm 安装错误 - MSB3428:无法加载 Visual C++ 组件“VCBuild.exe”

MSBUILD:错误MSB1009:项目文件不存在

error MSB8008: 指定的平台工具集(v110)未安装或无效。请确保选择受支持的 PlatformToolset 值

c++程序不识别库

当代码在 Visual Studio C++ 中正常工作时出现 MSB6006 错误

错误 MSB8052:MSVC 工具集版本“14.28.29333”与“v120”平台工具集不兼容