我用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
但这对我没有太大帮助:
我不能以某种方式告诉matlab首先在intel fortran目录中寻找libifcoremd.dll'
,而不是在matlab目录中寻找吗? (我在addpath
文件中尝试过.m
,但没有成功。)我应该怎么做?
答案 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
进行编译,即情况在这里。