目录
用惯了MATLAB然后用Fortran感觉也太逆天了,什么都要定义,写起来巨麻烦。但是模式是Fortran的代码,调参赋值再读取很麻烦,迫于无奈学习了一下MATLAB调用Fortran。新手,参考了很多文章,如有错误请指出~ :)
MATLAB安装MinGW-w64 C/C++编译器
用matlab调用fortran需要安装fortran编译器,在matlab命令行中键入“mex -setup”,系统报错,显示如下,则需要安装编译器,此处安装的为TDC-GCC。
错误使用 mex 未找到支持的编译器或 SDK。您可以安装免费提供的 MinGW-w64 C/C++ 编译器;请参阅安装 MinGW-w64 编译器。
GCC的历史及MinGW和TDM的区别具体请看这些:
MinGW MinGW-w64 TDM-GCC 等工具链之间的区别与联系 https://blog.csdn.net/wjheha/article/details/77648729
MinGW 、 MinGW-w64 与 TDM-GCC 应该如何选择? https://www.zhihu.com/question/39952667
1下载
选择对应版本的tdm-gcc:http://tdm-gcc.tdragon.net/download
2.安装
因为需要自己做环境变量,建议按照默认路径安装。
3.设置系统环境变量
win10:开始-设置-系统-关于-拉到底找到”高级系统设置“。
点击高级系统设置>高级选项卡。点击环境变量。
在系统变量下,选择新建。
在“新建系统变量”对话框的“变量名称”字段中输入MW_MINGW64_LOC。
在变量值字段中,键入MinGW-w64编译器安装的位置,例如“C:\TDM-GCC-64”(注意:“C:\TDM-GCC-64”是MinGW的安装目录)
安装完成后,输入
mex -setup
显示如下内容则设置完成,虽然需要更新但不影响使用。可自行更新。
MEX 配置为使用 'MinGW64 Compiler (C)' 以进行 C 语言编译。
警告: MATLAB C 和 Fortran API 已更改,现可支持
包含 2^32-1 个以上元素的 MATLAB 变量。不久以后,
您需要更新代码以利用
新的 API。您可以在以下网址找到相关详细信息:
http://www.mathworks.com/help/matlab/matlab_external/upgrading-mex-files-to-use-64-bit-api.html。
要选择不同的语言,请从以下选项中选择一种命令:
mex -setup C++
mex -setup FORTRAN
Fortran动态链接库DLL
1创建DLL
我用的VS+IVF的搭配,在VS中新建项目,选择动态链接库,有没有sample code都可,作为菜鸡的我一般都选择有sample code的😀。
2写DLL代码
此处用的别人的示例👉 https://blog.csdn.net/weixin_31880681/article/details/115896677
subroutine add(x,y,z)
!DEC$ ATTRIBUTES C,DLLEXPORT :: add
!DEC$ ATTRIBUTES REFERENCE ::z !返回值,传地址
implicit none
integer::x,y
integer::z
z=x+y
end subroutine
然后编译生成.dll。64位版本记得生成64位,而且解决方案和dll的名称要对应,不然会报错。
3编写头文件
void add(int,int,int*);
void代码名须与子例行程序名相同,该头文件可在任何文件编辑器中编写,编写完后保存头文件,本例中头文件名为:test.h。每一个dll文件可包含多个子例行程序,在书写头文件代码时需要对应书写多个void代码。
变量的数据类型要匹配,在Fortran中常用的数据参数类型有:
REAL:表示浮点数据类型,即小数,等价于C的float;
INTEGER:表示整数类型,相当于int;
DOUBLE PRECISION:表示双精度数据类型,相当于double。
4编辑m文件
clear all;clc;
loadlibrary('test.dll', 'test.h'); %加载dll及对应的头文件
x=0; %输出变量必须赋初值
a=1;b=2;
A=calllib('test', 'add', a,b,x);%调用dll中子程序
disp('结果是');disp(A)
unloadlibrary test %释放dll,无需后缀
运行即调用成功,结果为3。
此处参考同时参考了: