在FORTRAN中调用matlab编译生成的库
拙作《深入浅出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的图形窗口了。
以下是一个实例,从实现上的不同烦请给点儿评价
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.编译后得到如下结果:
页:
[1]