【问题标题】:Upgrading to Universal CRT-how can I get rid of a dependency on vcruntime140.dll and msvcp140.dll?升级到通用 CRT-如何摆脱对 vcruntime140.dll 和 msvcp140.dll 的依赖?
【发布时间】:2020-04-22 21:00:04
【问题描述】:

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

我已经查看了这个回复herethis blog post,它们很好地解释了事情,但仍然没有运气。这是我所做的更改:

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

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

  • ucrt.lib
  • 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

总结

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

我是否还缺少其他东西来消除对特定 CRT 版本的依赖?

【问题讨论】:

  • 许多语言运行时依赖于 CRT 来完成基本工作。但是如果你用 C++ 编程,那么你确实需要 vcruntime 和 msvcp。
  • 我并不担心对这些文件的依赖,但我认为通用 CRT 的意义在于有一个单独的 DLL 版本 (ucrtbase.dll) 已就地更新,而不是特定版本(VCRUNTIME140.dll)。我刚刚测试了一台干净的win10 1903机器,它有ucrtbase.dll,只是没有VCRUNTIME140.dll。我可以部署它,但我试图最小化依赖关系,并使用操作系统更新的库。
  • 对...除了 2014 年的情况,blog post from 2015 明确指出:“通用 CRT 是 Windows 操作系统组件。它是 Windows 10 的一部分。”我想这意味着所有的旧想法都是新的?
  • 今天早上,我尝试了一些新的东西。 File->new project->DLL,并创建了一个全新的 vcxproj 文件,其中没有自定义代码。根据 UCRT 上的原始帖子,这应该意味着我所有的依赖项都在通用库上,而不是特定于版本的库。即使在这里(在显式链接 ucrt.lib;vcruntime.lib;msvcrt.lib; 并添加 UCRT 包含和 lib 目录之后),DLL 仍然依赖于 VCRUNTIME140.dll。

标签: visual-c++ msvcrt crt


【解决方案1】:

我做了更多的挖掘,发现this page 上面写着以下内容:

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

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

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-29
    • 2013-03-27
    • 2017-01-16
    相关资源
    最近更新 更多