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

问题描述 投票:0回答:1

我有一个项目,我想升级到通用CRT,我仍然看到vcruntime140.dll和msvcp140.dll的依赖,我认为应该用ucrtbase.dll以及api-ms-win-crt* dlls替换。

我已经查看了这个回复 此处本博文这很好地解释了事情,但还是没有结果。 下面是我修改的内容。

  • 平台工具集: 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依赖程序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++ msvcrt crt
1个回答
0
投票

我又做了一些调查,发现了 本页 的,说了以下内容。

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

很好,这正是我所期望的。 不过就在下面是这样的。

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

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

总是有静态链接(MT)的选项,但在我的情况下,我也在看一个有clr的DLL,这两个选项是相互排斥的。 应用程序本地部署(只需将vcruntime140.dll与二进制文件一起复制)似乎也可以,对于我想做一个portantxcopy部署的东西来说,可能是最好的选择。

我打算暂时把这个标记为答案,但如果有办法解决这个问题,我很想看看。

© www.soinside.com 2019 - 2024. All rights reserved.