今天我遇到了一个问题。
我正在构建我自己的动态链接库(C++),它被用作OpenCities地图的插件。在我的本地计算机(用于开发项目的同一台计算机)上,一切正常工作,我的DLL没有问题地加载,一切正常。然而,今天我在虚拟机上尝试了同样的方法,看看它在其他机器上是否也能正常工作。这时,我遇到了问题,说我的DLL由于它的一些依赖项而无法加载(这是我的猜测)。
所以我开始调查。我使用DependencyWalker和Proccess 来查看DLL是如何加载的,以及失败了什么。输出更让我困惑。
在我的本地机器上,当我打开DLL时,它也可以加载像MSVCP140D.dll这样的依赖项。
我假设我甚至可以看到它的内容和整个路径(当我单击以显示完整的路径时)。proccess监视器还显示,它从我在Dependency中看到的文件夹中正确加载。
一开始,我看到它在名为MSVCP140D.dll的大写DLL中失败,但随后它成功地获得了正确的路径(System32 32/msvcp140d.dll)。
现在是虚拟机(或其他计算机)。在这里,我无法在依赖项遍历器中看到通往msvcp140d.dll的路径,因此我也无法看到内容(或该DLL中的其他包含)。
然后,即使在进程管理器中,它也无法加载这些DLL,即使它看起来是正确的路径。问题是,它查找大写DLL名称MSVCP140d.dll (我可以从字面上看到system32文件夹中的msvcp140d.dll ),没有找到结果名称。为什么它寻找的是MSVCP140D.dll而不是msvcp140d.dll?我的意思是,我希望类似于我的本地机器上的行为,开始寻找小写dll版本,但它仍然只查找大写版本。
我尝试过安装VS再发行版,.NET框架,但是没有任何效果。我正在使用VS17构建这个项目,它的x64 DLL还带有/clr和/MDd开关(如果有帮助的话)。
我会在特定的OpenCities地图论坛上询问,但对于我来说,这就像是某种一般性的建筑问题,这是我错过的。
你们有什么建议吗?谢谢你的建议。
发布于 2021-05-14 19:39:16
不应该根据运行时库DLL的调试版本传送代码。微软不支持这一点。DLL名称不区分大小写,BTW,所以这是一条红鲱鱼.
https://stackoverflow.com/questions/67540015
复制相似问题