MATLAB调用Fortran

目录

MATLAB安装MinGW-w64 C/C++编译器 

1下载

2.安装

3.设置系统环境变量

Fortran动态链接库DLL

1创建DLL

2写DLL代码

3编写头文件

4编辑m文件


用惯了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。

此处参考同时参考了:

https://blog.csdn.net/yuanxzo/article/details/81537803

https://blog.csdn.net/u011813050/article/details/82757662

  • 7
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值