Matlab的libifcoremd.dll中缺少符号'for_realloc_lhs'

时间:2018-08-01 20:25:01

标签: matlab fortran mex intel-fortran

我用toto.dll构建了一个toto.lib和一个ifort(Intel的2017更新4 fortran编译器)。然后,我使用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更新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目录中寻找吗? (我在addpath文件中尝试过.m,但没有成功。)我应该怎么做?

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

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

希望对您有所帮助。

答案 2 :(得分:-1)

当且仅当不使用函数obj时,toto.lib文件和ifort应当使用-nostandard-realloc-lhs和选项for_realloc_lhs进行编译,即情况在这里。