Matlab 的 libifcoremd.dll 中缺少符号“for_realloc_lhs”
Posted
技术标签:
【中文标题】Matlab 的 libifcoremd.dll 中缺少符号“for_realloc_lhs”【英文标题】:Missing symbol 'for_realloc_lhs' in Matlab's libifcoremd.dll' 【发布时间】:2018-08-01 20:25:00 【问题描述】:我用ifort
(Intel 2017 update 4 fortran 编译器)构建了一个toto.dll
和一个toto.lib
。然后我用mex
matlab的编译器生成了几个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 的 libifcoremd.dll 中缺少符号“for_realloc_lhs”的主要内容,如果未能解决你的问题,请参考以下文章
Release 编译需要 mfc140ud.dll 和 vcruntime140d.dll
找不到 c:\windows\system32\mfc100d.dll