声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1038|回复: 1

[共享资源] 在FORTRAN中调用matlab编译生成的库

[复制链接]
发表于 2016-7-21 11:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
拙作《深入浅出matlab7.x混合编程》中讲述了若干matlab和其他编程语言的混合编程问题,其中讲到了如何在c/c++中使用mcc编译生成的库以实现使用matlab计算、画图的功能。其实也可以在fortran中实现。这个帖子用一个简单的例子演示如何在fortran中使用这样的库。作为一个补充材料吧。

试验环境:windows server 2003 std,matlab 6.5.1, msvc 6.0, MinGW gcc 3.4.5.

这里仍然使用拙作《深入浅出matlab7.x混合编程》第七章中的mcctest01.m作为例子,这是一个简单的m文件,其功能是画一个简单的二维图。代码如下:


  • function mcctest01
  • % MCCTEST01 Create some data and draw a 2D x-y plot
  • %   mcctest01 is used to demonstrates how to convert M-functions into
  • %   library files and how to use created library files with MFC
  • %   applications.
  • %
  • %   Inputs:
  • %       None
  • %
  • %   Output:
  • %       None
  • %
  • %   Copyright (c) 2005 Dong Weiguo
  • % create data
  • x = 0:.01:20;
  • y = x.*sin(x);
  • % draw a plot
  • plot(x,y);
  • xlabel('x');
  • ylabel('y');



假设你在matlab中已经设置过mbuild使用msvc6,那么可以在matlab中使用如下命令把mcctest01.m编译成一个库函数:


  • mcc -B sgl -t -W libhg:mcctestlib -T link:lib mcctest01 libmwsglm.mlib -h



结果将产生mcctestlib.lib, mcctestlib.h, mcctestlib.dll等。把这三个文件拷贝到fortran源文件所在的目录。

然后在fortran源文件目录,首先产生一个c/c++ 的wrap文件:


  • // File: mcctest01wrap.cpp
  • // Description: A simple testing c++ souce file. A function
  • // is defined, which will be called in a FORTRAN 77 code.
  • //
  • // History: Created on 1 September, 2006
  • // Created by: Dong Weiguo
  • //////////////////////////////////////////////////////////////
  • #include "mcctestlib.h"
  • // By default, most of fortran compilers would add an
  • // undrescore at the end of function name
  • // So let's emulate this bahavior
  • extern "C" void mcctest01_()
  • {
  •      mcctestlibInitialize();
  •         mlfMcctest01();
  •      mcctestlibTerminate();
  • }



然后创建一个fortran源文件f77mcctst.for:


  • C      A test program to demonstrate how to call c++
  • C      functions from a Fortran program.
  • C      Synopsis: f77mcctst
  • C      History: 1 September, 2006
  • C      Created by: Dong Weiguo
  •        program f77mcctst
  •        call mcctest01()
  •        stop
  •        end



最后创建一个Makefile:


  • # makefile for f77mcctst on Windows by using MinGW
  • CC = g77
  • CFLAGS = -Wall -g -IH:\MATLAB6p5p1\extern\include
  • FFLAGS = #-fno-underscoring -fno-second-underscore
  • LDFLAGS = -LH:\MATLAB6p5p1\extern\lib\win32\microsoft\msvc60
  • MYEXE = f77mcctst.exe
  • MYOBJS = f77mcctst.o mcctest01wrap.o
  • #default target = all
  • all :  $(MYEXE)
  • $(MYEXE) : $(MYOBJS)
  •         g77 -o $(MYEXE) $(MYOBJS) mcctestlib.lib libmwsglm.lib libmmfile.lib libmatlb.lib libmx.lib sgl.lib libut.lib $(LDFLAGS) -lm -lstdc++
  • mcctest01wrap.o : mcctest01wrap.cpp
  •         g++ -c $(CFLAGS) mcctest01wrap.cpp
  • f77mcctst.o : f77mcctst.for
  •         g77 -c $(FFLAGS) f77mcctst.for
  • clean:
  •         del *.o
  •         del $(MYEXE)



注:为了测试方便,我把matlab下面的msvc6所对应的lib文件拷贝到fortran源文件目录。

最后在fortran源文件目录,在dos命令行用如下命令编译:


  • mingw32-make



结果生成f77mcctst.exe,运行后就可以看见matlab的图形窗口了。
回复
分享到:

使用道具 举报

发表于 2016-7-21 11:05 | 显示全部楼层
以下是一个实例,从实现上的不同烦请给点儿评价
1.完成一系列库文件配置(我用的是CVF6.6)
2.在FORTRAN中使用控制台程序console application
3.F90文件写如下代码:
  • PROGRAM MAIN
  • USE FML
  • USE FGL
  • IMPLICIT NONE
  • TYPE(mfArray)::nx,ny,nz
  • TYPE(mfArray)::x,y,z,c,tet
  • nx=mfLinspace(-2,2.2d0,21)
  • ny=mfLinspace(-2,2.25d0,17)
  • nz=mfLinspace(-1.5d0,1.6d0,31)
  • call msMeshgrid(mfOut(y,x,z),ny,nx,nz)
  • c=2*mfCos(x**2)*mfExp(-(y**2)-(z**2))
  • tet=mfGetDelaunay3(x,y,z)
  • call msTetSliceXYZ(tet,x,y,z,c,&
  •                 mf((/1.0d0,1.0d0/)),mf(0),mf(-0.75d0))
  • call msViewPause()
  • call msFreeArgs(nx,ny,nz,x,y,z,c)
  • END PROGRAM MAIN



4.编译后得到如下结果:
danweiyuan_ryBqDR0qt3cj.jpg
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-3 13:22 , Processed in 0.181879 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表