visual-c++ - 升级到通用 CRT-如何摆脱对 vcruntime140.dll 和 msvcp140.dll 的依赖?
问题描述
我有一个项目,我正在尝试更新到通用 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.lib
- vcruntime.lib
- msvcrt.lib
- 用户32.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 版本的依赖吗?
解决方案
我做了一些更多的挖掘,发现这个页面说以下内容:
从 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 部署的最佳选择。
我现在将其标记为答案,但如果有办法解决这个问题,我有兴趣看到它。
推荐阅读
- javascript - 如何访问这些 JSON 值?
- api - Mule 4:API 设计:如何设计一个 mule 应用程序在给定的持续时间内最多调用一次具有某些参数的 API?
- tensorflow - 如何构建自己的手写数字数据集
- c# - Asp.net core 路由,添加 react spa & blazor server
- reactjs - 反应功能组件中映射对象的反应可拖动保存位置
- c - 更有效的方法来检查数字并相应地添加到十六进制代码
- python - 请帮助制作一个python 3程序来确定一个数字是否是回文
- mongodb - mongodb admin 用户认证失败
- reactjs - React useState 不传入值
- javascript - 在 Kendo Script Tag 中提交表单