首页 > 解决方案 > 升级到通用 CRT-如何摆脱对 vcruntime140.dll 和 msvcp140.dll 的依赖?

问题描述

我有一个项目,我正在尝试更新到通用 CRT,但我仍然看到对 vcruntime140.dll 和 msvcp140.dll 的依赖,我认为它们应该被替换为 ucrtbase.dll,以及api-ms-win-crt* dll。

我已经在这里查看了这个回复和这篇博客文章,它们很好地解释了事情,但仍然没有运气。这是我所做的更改:

我还将我的链接器依赖项更新到了这个集合:

但是当我运行 dumpbin /dependents mydll.dll

文件类型:DLL

图像具有以下依赖项:

api-ms-win-crt-string-l1-1-0.dll
api-ms-win-crt-heap-l1-1-0.dll
api-ms-win-crt-runtime-l1-1-0.dll
api-ms-win-crt-stdio-l1-1-0.dll
api-ms-win-crt-filesystem-l1-1-0.dll
api-ms-win-crt-convert-l1-1-0.dll
api-ms-win-crt-time-l1-1-0.dll
api-ms-win-crt-environment-l1-1-0.dll
api-ms-win-crt-utility-l1-1-0.dll
VCRUNTIME140.dll
USER32.dll
ADVAPI32.dll
WSOCK32.dll
CRYPT32.dll
WS2_32.dll
MSVCP140.dll
bcrypt.dll
KERNEL32.dll

概括

    E000 .data
   66000 .rdata
    E000 .reloc
    1000 .rsrc
  14A000 .text

我还缺少其他什么东西可以放弃对特定 CRT 版本的依赖吗?

标签: visual-c++msvcrtcrt

解决方案


我做了一些更多的挖掘,发现这个页面说以下内容:

从 Visual Studio 2015 开始,CRT 已重构为新的二进制文件。通用 CRT (UCRT) 包含标准 C99 CRT 库导出的函数和全局变量。UCRT 现在是一个 Windows 组件,并作为 Windows 10 的一部分提供。

太好了,这正是我所期望的。就在下面是这样的:

vcruntime 库包含 Visual C++ CRT 实现特定的代码,例如异常处理和调试支持、运行时检查和类型信息、实现细节和某些扩展库函数。该库特定于所使用的编译器版本。

这意味着仍然存在由 VS 链接的非通用 VC++ 依赖项。对我来说,这意味着一个无依赖的 DLL 并不真正存在(至少不是用 VC++ 构建的东西),因为你总是有一个 vcruntime 依赖。

总是有静态链接 (/MT) 的选项,但在我的情况下,我也在查看具有 /clr 的 DLL,这两个选项是互斥的。应用程序本地部署(只需将 vcruntime140.dll 与二进制文件一起复制)似乎也可以工作,并且可能是我想要成为可移植/xcopy 部署的最佳选择。

我现在将其标记为答案,但如果有办法解决这个问题,我有兴趣看到它。


推荐阅读