我有一个调用MATLAB(v7.0.4)编译器生成的dll的项目。同一个项目也称为MKL英特尔Fortran 2011例程。 该程序抱怨存在冲突的mkl库,这些库试图初始化,因为当我也直接使用来自最近的MKL库的一些MKL例程时,MATLAB有自己的(在这种情况下是较旧的)mkl库。确切的消息是“OMP中止:初始化libguide40.lib但发现libiomp5md.dll已经初始化。”INTEL建议不太理想的修复是设置环境变量KMP_DUPLICATE_LIB_OK = TRUE来克服这种情况。我想要一个更合适的解决方案。
当然,只有当项目调用MKL例程而Matlab编译的dll已经初始化但尚未终止(使用Initialize和Terminate)时,才会出现此问题。如果我事先调用Matlab上的Terminate comllled dll,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'链接',但这也没有解决它。所以我的项目调用一个'link'dll,后者又调用Matlab编译的dll,我试着终止Matlab编译的dll然后释放'link'dll但是由于某种原因我仍然无法重新加载Matlab编译的dll。 / p>
有关如何处理此问题的任何建议?我是新手,所以我的描述可能不太准确。
谢谢, 萨默尔。
答案 0 :(得分:0)
libguide40.dll
和libiomp5md.dll
实际上都是OpenMP的运行时库(后来更新,更高级)。建议不要使用KMP_DUPLICATE_LIB_OK = TRUE
,因为它可能会导致性能问题甚至挂起。我能想到的只有一种可能的解决方案:
切换到更新版本的MATLAB。更高版本的MATLAB使用libiomp5md.dll
,因此您的应用程序可以与MATLAB附带的libiomp5md.dll
链接。