【问题标题】:DLL Hell with Intel Redistributables带有英特尔可再发行组件的 DLL 地狱
【发布时间】:2016-01-28 09:07:15
【问题描述】:

我们的一些用户一直在抱怨我们的插件加载时 libmmd.dll not found 错误。

一些背景:

  • 我说的是 Windows(就此而言为 8)上发生的问题。
  • 我们为 数字音频工作站 开发插件(用于数字声音 处理目的)。
  • 我们的插件是一个在 VS2012 中编码的 DLL,并通过调用 icl.exe 的 Perl 脚本使用 Intel Compiler 2015 编译 来自 cmd
  • 它的一个依赖项是 Intel 提供的数学 2015 风格的可再发行组件 中提供的库(我们 与我们的插件一起安装)称为 libmmd.dll

为方便起见,我们将插件 DLL 称为 plugin.dll (!!!)。

我在其中一台受影响用户的机器上没有太多时间,但据我所见,重新安装英特尔的可再发行组件包并没有帮助,只是将 libmmd.dll 移动到与 plugin.dll 相同的文件夹中。

无论这种(突然和意外)行为的原因是什么,我们都希望能够提供针对此类问题(DLL Hell)的软件。

我们希望 plugin.dll 首先在特定目录中查找库(可配置会更好),然后在其通常的search order 中查找库。

我尝试使用 清单注册表库名称链接器选项... 唯一真正起作用的是用 /MT 切换 /MD 选项(但使用静态库重新编译确实会增加 plugin.dll 的大小)并将库复制到 plugin.dll 所在的文件夹.

有什么想法吗? 谢谢!

【问题讨论】:

  • /MT 对于插件来说是相当合理的。大小增长只是感知,您必须通过对所有依赖项的大小求和来衡量 /MD 大小。永远不会小于 /MT 尺寸。您可以与另一个进程共享 /MD 依赖项的可能性永远不会那么好。并导致 DLL 地狱。

标签: c++ windows dll manifest redistributable


【解决方案1】:

SetDllDirectory 函数可让您将文件夹路径添加到 DLL 搜索顺序。它将被添加到第二个位置,紧接着程序文件夹本身。

这只会影响通过 LoadLibrary 加载的 DLL;如果您的 DLL 是静态加载的,则不会有任何区别。

【讨论】:

    最近更新 更多