首页 > 解决方案 > 在加载我自己的 DLL 时找不到正确的 MSVCP140d.dll 依赖项,即使它存在于文件夹中

问题描述

今天我遇到了一个问题。

我正在构建自己的 DLL(C++),用作 OpenCities Map 的插件。在我的本地计算机(用于开发项目的同一台计算机)上,一切正常,我的 DLL 加载没有问题,一切正常。但是,今天我在虚拟机上尝试了同样的事情,看看它是否在其他机器上也能正常工作。那是当我遇到问题说我的 DLL 由于它的某些依赖项而无法加载(这是我的猜测)。

于是我开始调查。我使用DependencyWalkerProccess Monitor来查看 DLL 是如何加载的以及失败的原因。输出让我更加困惑。

在我的本地机器上,当我打开 DLL 时,它还可以加载 MSVCP140D.dll 等依赖项。

在此处输入图像描述

我假设我什至可以看到它的内容和整个路径(当我单击以显示完整路径时)。进程监视器还显示它是从我在 Dependency walker 中看到的文件夹中正确加载的。 在此处输入图像描述

起初我看到它在名为 MSVCP140D.dll 的大写 DLL 中失败,但随后它以正确的路径 (System32/msvcp140d.dll) 成功。

现在是虚拟机(或其他计算机)。在这里,我在依赖项walker 中看不到msvcp140d.dll 的路径,所以我也看不到内容(或该DLL 中的其他包含)

在此处输入图像描述

然后,即使它看起来是正确的路径,它也无法在进程管理器中加载这些 DLL。问题是,它查找大写的 DLL 名称 MSVCP140d.dll(我可以从字面上看到 system32 文件夹中的 msvcp140d.dll),结果未找到名称。为什么它寻找 MSVCP140D.dll 而不是 msvcp140d.dll ?我的意思是,我希望像在我的本地机器上一样,开始寻找小写的 dll 版本,但它仍然只寻找大写的版本。

在此处输入图像描述

我尝试安装 VS 可再发行组件、.NET 框架,但没有任何效果。我正在使用 VS17 构建项目,它的 x64 DLL 还带有 /clr 和 /MDd 开关(如果有帮助的话)。

我会在特定的 OpenCities Map 论坛上提问,但这对我来说就像是某种一般的建筑问题,我错过了一些东西。

你们有什么建议吗?感谢您的任何建议。

标签: c++visual-studiodllmsvcrt

解决方案


您不应该根据运行时库 DLL 的调试版本发布代码。微软不支持这个。DLL 名称不区分大小写,顺便说一句,这是一条红鲱鱼。


推荐阅读