从 Matlab 调用 Fortran 中的 C 兼容 DLL

C-compatible DLL in Fortran to call from Matlab

我想在 Fortran 中创建一个与 C 兼容的 DLL,以便稍后从 Matlab 调用它。

我在 addnums.f90 中使用以下 Fortran 代码创建*.dll:

function addnums(val1, val2) bind(c, name='addnums')
!DEC$ ATTRIBUTES DLLEXPORT :: addnums
use iso_c_binding, only: c_float
implicit none
real(c_float), intent(in) :: val1, val2
real(c_float) :: addnums
addnums = val1 + val2
end function

和以下头文件addnums.h:

float addnums(float *val1, float *val2);

然后我运行下面的matlab脚本addnums_test.m:

loadlibrary('addnums.dll','addnums.h');
addnums(2, 2);

并得到以下错误:

Undefined function or variable 'addnums'.

Error in addnums_test (line 2)
addnums(2, 2);

为什么函数 'addnums' 未定义?我该如何解决这个问题?


更新:

calllib('addnums.dll', 'addnums', 2, 2);

libfunctions(addnums);

产生同样的错误,所以我猜测是库本身没有正确编译


*我将 Visual Studio Community 2015 与 Intel Fortran Compiler 15 和 Matlab R2016b x64 一起使用。构建 .dll 时我使用 x64 配置,否则 Matlab 甚至不会加载库。

从 Matlab 调用此库函数的有效语法是:

calllib('addnums', 'addnums', 2, 2)

避免在库名称中使用 .dll 扩展名很重要。