【发布时间】: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