【发布时间】:2020-04-22 21:00:04
【问题描述】:
我有一个项目正在尝试更新到通用 CRT,但我仍然看到对 vcruntime140.dll 和 msvcp140.dll 的依赖,我认为它们应该被替换为 ucrtbase.dll,以及 api-ms-win-crt* dll。
我已经查看了这个回复here 和this 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