【发布时间】:2020-05-13 08:05:02
【问题描述】:
我在 Visual Studio 2019 中编写了一个 C++ 控制台应用程序,并试图将其部署到另一台 Windows 笔记本电脑上。两台笔记本电脑都是最新的 64 位 Windows 10,我的目标笔记本电脑已安装/最新的 .NET Framework、vc_redist.x64.exe 和 DirectX。
在部署方法方面,我一字不差地遵循this Microsoft walkthrough,增加了确保我新创建的“设置”项目也针对x64平台的步骤,因为我的代码中的一些外部库需要x64。生成的“设置”.exe/.msi 对在源笔记本电脑上按计划工作 - 无需任何装饰即可安装和运行。
在目标笔记本电脑上安装正常,但启动程序会出现本文标题中提到的错误。经过几个小时的尝试,我想我知道问题出在哪里了,但首先,我将分享我尝试过的,这基本上是找到的所有建议通过谷歌搜索此错误代码:
- 干净启动
- SFC 扫描
- chkdsk c: /f /r
- 修复/重新安装第一段中提到的所有框架
- 以管理员身份运行应用程序安装程序和已安装的应用程序
- 在完成所有这些更改后重新启动笔记本电脑并重新安装应用程序
我认为问题的根源是什么:
在 VS 的 setup/deployment 项目中,三个“检测到的依赖项”(MSVCP140D.dll、ucrtbased.dll、VCRUNTIME140D.dll)具有通过 ...\System32\ 的文件路径,而不是在 ... \SysWOW64。另外两个检测到的依赖项是外部 64 位 DLL(这就是我将整个项目指定为 x64 的原因)。当我通过 Dependency Walker 运行我的应用程序时,它同意前面提到的三个依赖项是“错误的 CPU 类型”,而后两个是好的。但是,这种情况并没有向我解释为什么安装/运行(在 VS 之外)在源笔记本电脑上运行良好(如果 VS 打包了 32 位和 64 位依赖项的混合,它不应该不起作用吗? em>)。事实上,通过 Dependency Walker 在源笔记本电脑上运行应用程序会发现与在目标笔记本电脑上完全相同的情况 - 相同的 3 个依赖项是“错误的 CPU 类型”,但应用程序在此处运行。
我在 VS 中没有看到将“设置”项目更改为读取 64 位文件路径的选项。我曾尝试在各个阶段手动交换 64 位 DLL(包括在 DLL 交换和应用程序运行之间重新启动计算机),这似乎没有任何效果。事实上,我尝试用 SysWOW64 文件夹中的 DLL 替换 System32 文件夹中的 3 个相关 DLL(我的想法是无法更改文件路径的廉价解决方法 - 只需更改文件),这只是让我得到我的源笔记本电脑上的错误与我在目标笔记本电脑上遇到的错误相同。
所有这些东西对我来说都是比较新的,所以如果我愚蠢地忽略了我的流程/项目的一些基本细节,请告诉我 - 在这一点上,如果是这样的话会很好,而且这很容易修复。
【问题讨论】:
-
您可能会考虑使用静态运行时而不是 DLL 进行链接。这以牺牲更大的可执行文件为代价避免了这样的痛苦。
-
VCRUNTIME140D.dll 问题的根源在于链接到调试
dlls。.dll之前的d表示这一点。您不得部署这些或依赖于它们的应用程序(这违反了 Visual Studio 许可证)。它们只能在安装了 Visual Studio 的系统上使用。这就是可再发行组件不包含调试dll运行时文件的原因。此外,如果这是链接到调试 dll 的发布模式应用程序,则您有未定义的行为。 -
非常感谢你们。帮助我更好地理解,并解决了我的问题。目标笔记本电脑现在成功运行应用程序:)
标签: c++ visual-studio dll deployment frameworks