Claudia 发表于 2016-7-21 11:04

在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的图形窗口了。

Everley 发表于 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.编译后得到如下结果:

页: [1]
查看完整版本: 在FORTRAN中调用matlab编译生成的库