Matlab 的 libifcorem​d.dll 中缺少符号“for_realloc_lhs”

Posted

技术标签:

【中文标题】Matlab 的 libifcorem​d.dll 中缺少符号“for_realloc_lhs”【英文标题】:Missing symbol 'for_realloc_lhs' in Matlab's libifcorem​d.dll' 【发布时间】:2018-08-01 20:25:00 【问题描述】:

我用ifort(Intel 2017 update 4 fortran 编译器)构建了一个toto.dll 和一个toto.lib。然后我用mexmatlab的编译器生成了几个mexw64文件。

当我使用mex 时,我链接到toto.lib。然后,我在 matlab 2017a 64 位(在 win10 64 位下)运行了一个.m 文件(matlab 文件),这个文件使用了我编译的各种 mexw64 的函数。

在 matlab 文件中,第一次调用此类函数时出现以下错误:

Invalid MEX-file 'C:\path\to\mexfile.mexw64': Missing symbol 'for_realloc_lhs'
in 'C:\Program Files\MATLAB\R2017a/bin/win64\libifcoremd.dll' required by 'C:\path\to\mexfile.mexw64'.

我的 fortran 编译器是 intel fortran 2017 update 4。

我发现了这个:

https://software.intel.com/en-us/forums/intel-visual-fortran-compiler-for-windows/topic/726858

但它对我没有多大帮助:

用 intel fortran 替换 matlab dll 不是一个可行(也不正确)的解决方案(它隐藏了真正的问题) asking mathworks 到目前为止没有得到任何答复......(因此我在这里发帖)

我不能以某种方式告诉 matlab 先在 intel fortran 目录中查找libifcoremd.dll',而不是在 matlab 目录中查找吗? (我在.m 文件中尝试了addpath,但没有成功。)我该怎么办?

【问题讨论】:

【参考方案1】:

如果 Matlab 将 libifcoremd.dll 包含在与 Matlab 可执行文件相同的文件夹中,这对他们来说是一件可怕的事情,你不能覆盖它。我的建议是从该位置删除英特尔编译器 DLL,尽管它们可能会在更新时返回。

如果它们位于 PATH 上命名的单独文件夹中,请确保 Intel 文件夹首先位于 PATH 上。

可能对您来说最好的方法是构建要链接到静态库的 DLL(Fortran > 库 > 使用运行时库 > 多线程 (/MT))。这样您就不会受到 Matlab 不良行为的摆布。仅当 DLL 的调用者不是 Fortran 时,我才建议这样做。

【讨论】:

Matlab 确实将 libifcoremd.dll 包含在与 matlab 可执行文件相同的文件夹中。英特尔编译器 dll 不在同一个文件夹中(感谢上帝)。 (我在 Windows 10 下,不知道在 Unix/Linux 上会发生什么......)今晚我将尝试你的文件夹排序链接以及到静态库的链接。会及时通知您。 实际上,我正在使用最初在 linux 上运行的代码,所以我现在在我的 windows 10 上使用命令行ifort,我不太了解“Fortran > 库 >现在使用运行时库 > 多线程 (/MT)" 视觉工作室位。 (虽然它让我想起了视觉工作室中的一些英特尔 MKL 选项)。我将尝试以命令行方式实现它,当一切正常时,我会将它移植到 Visual Studio 中。 在命令行中,在构建 DLL 时使用 /MT 或 /libs:static。 最初我编译如下:"C:\Program Files\MATLAB\R2017a\bin\win64\mex.exe" -largeArrayDims toto.f totog.F mylib.lib -L"C:\Program Files\MATLAB\R2017a\bin\win64"(为了完整起见,mylib.lib 是通过ifort -c -fpp file1.f90 编译然后ifort -c -fpp file2.f90 然后ifort -c -fpp file3.f90 然后xilib /out:./libfinal.lib file1.obj file2.obj file3.obj)并且有“丢失“C:\Program Files\MATLAB\R2017a/bin/win64\libifcoremd.dll”中的符号“for_realloc_lhs”错误。 现在我用 "C:\Program Files\MATLAB\R2017a\bin\win64\mex.exe" -largeArrayDims toto.f totog.F mylib.lib -L"C:\Program Files (x86)\IntelSWTools\compilers_and_libraries_2018.0.124\windows\redist\intel64_win\compiler" -L"C:\Program Files\MATLAB\R2017a\bin\win64" 编译为 "C:\Program Files (x86)\IntelSWTools\compilers_and_libraries_2018.0.124\windows\redist\intel64_win\compiler" 包含 libifcoremd.dll 但我仍然有相同的错误如我上面的评论。【参考方案2】:

我遇到过类似的问题。我从 Intel Fortran Compiler 编译了 DLL,并从 MatLab 调用它。但是在 MatLab 中运行时,它抱怨缺少符号“for_realloc_lhs”。 解决方案是从菜单“project-->Fortran-->Libraries-->Runtime Library-->Multithreaded”中更改 Intel Fortran 编译设置中的编译选项。默认选项是多线程 DLL(/libs;dll/threads)。想法是将运行时的动态 dll 链接更改为静态 dll。

希望这对你有帮助。

【讨论】:

这个答案与 Steve Lionel 的答案有何不同?

以上是关于Matlab 的 libifcorem​d.dll 中缺少符号“for_realloc_lhs”的主要内容,如果未能解决你的问题,请参考以下文章

没有找到MFC42D.DLL

Release 编译需要 mfc140ud.dll 和 vcruntime140d.dll

找不到 c:\windows\system32\mfc100d.dll

在 delphi 中使用 COM DLL - MSVCR80D.dll 错误中的访问冲突

vc++ 中未处理的异常 (msvcp100d.dll)

MSVCP100D.dll 丢失