升级到通用 CRT - 如何摆脱对 vcruntime140.dll 和 msvcp140.dll 的依赖?

Chr*_*don 2 crt msvcrt visual-c++

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

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

  • 平台工具集:Visual Studio 2019 (v142)
  • Windows SDK版本:10.0(最新安装版本)
  • 附加包含目录:添加 $(UniversalCRT_IncludePath)
  • 附加库目录:添加了 $(UniversalCRT_LibraryPath_x86)

我还将链接器依赖项更新为该集:

  • ucrt库
  • vcruntime.lib
  • msvcrt.lib
  • user32.lib
  • advapi32.lib
  • Wsock32.lib
  • Crypt32.lib
  • ws2_32.lib

但是当我运行 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
Run Code Online (Sandbox Code Playgroud)

概括

    E000 .data
   66000 .rdata
    E000 .reloc
    1000 .rsrc
  14A000 .text
Run Code Online (Sandbox Code Playgroud)

我是否还缺少其他东西才能放弃对特定 CRT 版本的依赖?

Chr*_*don 5

我做了更多挖掘,发现此页面显示以下内容:

从 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 部署的最佳选择。

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