0

我有一个调用 MATLAB (v7.0.4) 编译器生成的 dll 的项目。同一个项目还调用了一些 MKL Intel Fortran 2011 例程。该程序抱怨有冲突的 mkl 库试图初始化,因为当我也直接使用更新的 MKL 库中的一些 MKL 例程时,MATLAB 有自己的(在这种情况下是旧的)mkl 库。确切的消息是“OMP abort: initializing libguide40.lib but found libiomp5md.dll already initialized”。INTEL 建议的不太理想的修复方法是设置环境变量 KMP_DUPLICATE_LIB_OK = TRUE 来克服这种情况。我想要一个更合适的解决方案。

自然,这个问题只会在项目调用 MKL 例程时出现,而 Matlab 编译的 dll 已经初始化但尚未终止(使用 Initialize 和 Terminate)。如果我事先在 Matlab 编译的 dll 上调用 Terminate,mkl 例程调用会正常工作。但是,对 Matlab 编译的 dll 和 MKL 的调用是交织在一起的,并且 matlab 编译的 dll 不接受在应用程序中多次使用 Initialize 和 Terminate,因此我无法卸载 matlab dll 以避免出现冲突的 mkl 库调用 MKL 例程,然后重新加载 dll 以进行更多 matlab dll 调用。如果我不止一次使用 matlab 编译的 dll 的接口方法 mclInitializeApplication 和 mclTerminateApplication 程序会崩溃,如果我多次使用 Initialize 和 Terminate,程序将无限期地挂在 Initialize 调用上。我不能使用 mclInhibitShutdown() 因为这不会终止 dll,而我需要这样做才能调用 MKL 例程而不会与 mkl 库发生冲突。

有没有办法在同一个应用程序中重复卸载和重新加载 Matlab 编译的 dll 以避免这种冲突的 mkl 库?我在我的项目和 Matlab 编译的 dll 之间添加了另一个 dll“链接”,但这也没有解决它。所以我的项目调用了一个“链接”dll,它又调用了 Matlab 编译的 dll,我尝试终止 Matlab 编译的 dll,然后释放“链接”dll,但由于某种原因,我仍然无法重新加载 Matlab 编译的 dll。

有关如何处理此问题的任何建议?我是新手,所以我的描述可能不是很准确。

谢谢,萨默。

4

1 回答 1

0

两者实际上都是 OpenMP 的运行时库(后来更新和更高级)libguide40.dlllibiomp5md.dll不推荐使用KMP_DUPLICATE_LIB_OK = TRUE,因为它可能会导致性能问题甚至挂起。我只能想到一种可能的解决方案:

切换到较新版本的 MATLAB。使用更高版本的 MATLAB libiomp5md.dll,因此您的应用程序可以libiomp5md.dll与 MATLAB 附带的链接。

于 2012-12-14T18:59:45.147 回答