从 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 扩展名很重要。
我想在 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 扩展名很重要。