【发布时间】:2014-07-21 14:01:48
【问题描述】:
我们正在为 Windows 环境中的第 3 方应用程序开发一个插件(每个插件都是一个 DLL 文件,存储在预先指定的文件夹中)。该应用程序在内部使用英特尔 MKL 10.3.9.1,并在其安装文件夹中附带 MKL DLL。
我们的插件DLL也依赖于MKL,但是我们必须使用更高版本(11.1.3.1),因为我们使用的是VS2012(旧版本的MKL不支持它)。我们将 MKL DLL 与我们自己的 DLL 放在插件文件夹中,该 DLL 是针对上述 MKL 版本构建的。这就是我们的代码与 MKL 的链接方式(在 x64 配置中):
#pragma comment(lib, "mkl_intel_lp64_dll")
#pragma comment(lib, "mkl_intel_thread_dll")
当应用程序运行时,它会从其文件夹中加载 MKL 10.3 DLL。加载插件 DLL 时,似乎加载了 MKL 11.1 DLL(至少访问了文件),但随后应用程序冻结(如果附加了调试器,我会看到访问冲突异常)。如果我们的代码中依赖于 MKL 的部分被存根替换,有效地消除了对 MKL 的依赖,应用程序就可以正常运行并使用插件。
我的猜测是这些问题的出现是因为我们的 DLL 期望与 MKL 11.1 一起工作,但实际上获取的是之前加载的 MKL 10.3(请注意,不同 MKL 版本的 DLL 具有相同的名称)。
有谁知道是否可以将两个不同版本的 MKL 加载到同一个进程中?
【问题讨论】: