找回密码
 注册
Simdroid-非首页
查看: 650|回复: 3

[原创]在FORTRAN中调用matlab编译生成的库

[复制链接]
发表于 2006-9-1 01:09:55 | 显示全部楼层 |阅读模式 来自 新加坡
(潜水太久,上来换口气)
拙作《深入浅出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文件,其功能是画一个简单的二维图。代码如下:

  1. function mcctest01
  2. % MCCTEST01 Create some data and draw a 2D x-y plot
  3. %   mcctest01 is used to demonstrates how to convert M-functions into   
  4. %   library files and how to use created library files with MFC
  5. %   applications.
  6. %
  7. %   Inputs:
  8. %       None
  9. %   
  10. %   Output:
  11. %       None

  12. %
  13. %   Copyright (c) 2005 Dong Weiguo

  14. % create data
  15. x = 0:.01:20;
  16. y = x.*sin(x);

  17. % draw a plot
  18. plot(x,y);
  19. xlabel('x');
  20. ylabel('y');
复制代码


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

  1. 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文件:

  1. // File: mcctest01wrap.cpp
  2. // Description: A simple testing c++ souce file. A function
  3. // is defined, which will be called in a FORTRAN 77 code.
  4. //
  5. // History: Created on 1 September, 2006
  6. // Created by: Dong Weiguo
  7. //////////////////////////////////////////////////////////////

  8. #include "mcctestlib.h"

  9. // By default, most of fortran compilers would add an
  10. // undrescore at the end of function name
  11. // So let's emulate this bahavior
  12. extern "C" void mcctest01_()
  13. {
  14.      mcctestlibInitialize();
  15.         mlfMcctest01();
  16.      mcctestlibTerminate();
  17. }
复制代码


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

  1. C      A test program to demonstrate how to call c++
  2. C      functions from a Fortran program.
  3. C      Synopsis: f77mcctst
  4. C      History: 1 September, 2006
  5. C      Created by: Dong Weiguo

  6.        program f77mcctst
  7.       
  8.        call mcctest01()
  9.   
  10.        stop
  11.        end

复制代码


最后创建一个Makefile:

  1. # makefile for f77mcctst on Windows by using MinGW

  2. CC = g77
  3. CFLAGS = -Wall -g -IH:\MATLAB6p5p1\extern\include
  4. FFLAGS = #-fno-underscoring -fno-second-underscore
  5. LDFLAGS = -LH:\MATLAB6p5p1\extern\lib\win32\microsoft\msvc60

  6. MYEXE = f77mcctst.exe
  7. MYOBJS = f77mcctst.o mcctest01wrap.o

  8. #default target = all
  9. all :  $(MYEXE)

  10. $(MYEXE) : $(MYOBJS)
  11.         g77 -o $(MYEXE) $(MYOBJS) mcctestlib.lib libmwsglm.lib libmmfile.lib libmatlb.lib libmx.lib sgl.lib libut.lib $(LDFLAGS) -lm -lstdc++
  12.        
  13. mcctest01wrap.o : mcctest01wrap.cpp
  14.         g++ -c $(CFLAGS) mcctest01wrap.cpp

  15. f77mcctst.o : f77mcctst.for
  16.         g77 -c $(FFLAGS) f77mcctst.for


  17. clean:
  18.         del *.o
  19.         del $(MYEXE)

复制代码


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

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

  1. mingw32-make
复制代码


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

附:由于时间仓促,少了很多说明文字。比如本来应该先说一下如何在fortran中调用c/c++等。以后有时间就会补上。欢迎大家讨论。

再附:这是偶的第1000贴。本来想写得更好一些,无奈时间不够用。只能这样了。抱歉。

评分

1

查看全部评分

发表于 2006-9-1 21:13:18 | 显示全部楼层 来自 新疆乌鲁木齐
Simdroid开发平台
幸亏今天睡的晚!
第一千贴,说过要祝贺,早等得心焦了。
不过还没看呢^_^,鼓掌吆喝先!!

不知道taohe老大试过matfor没有,今天大概看了看本贴,从功能的实现上有类似之处。
以下是一个实例,从实现上的不同烦请taohe和scie老大给点儿评价
1.完成一系列库文件配置(我用的是CVF6.6)
2.在FORTRAN中使用控制台程序console application
3.F90文件写如下代码:
  1. PROGRAM MAIN
  2. USE FML
  3. USE FGL
  4. IMPLICIT NONE
  5. TYPE(mfArray)::nx,ny,nz
  6. TYPE(mfArray)::x,y,z,c,tet
  7. nx=mfLinspace(-2,2.2d0,21)
  8. ny=mfLinspace(-2,2.25d0,17)
  9. nz=mfLinspace(-1.5d0,1.6d0,31)
  10. call msMeshgrid(mfOut(y,x,z),ny,nx,nz)
  11. c=2*mfCos(x**2)*mfExp(-(y**2)-(z**2))
  12. tet=mfGetDelaunay3(x,y,z)
  13. call msTetSliceXYZ(tet,x,y,z,c,&
  14.                 mf((/1.0d0,1.0d0/)),mf(0),mf(-0.75d0))
  15. call msViewPause()
  16. call msFreeArgs(nx,ny,nz,x,y,z,c)
  17. END PROGRAM MAIN
复制代码

4.编译后得到如下结果:

两位老大如果有兴趣可以尝试一下,关于速度,易用性等也请给一些评介,谢谢!

[ 本帖最后由 bainhome 于 2006-9-1 22:12 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 发表于 2006-9-1 22:40:12 | 显示全部楼层 来自 新加坡
完成了第一个1000贴,那就朝2000、10000或更多贴努力前进:)

感谢bainhome兄关于matfor的介绍和分享。我没有用过matfor,不过看起来好像挺不错得样子,如果有人得主要编程语言是fortran的话,倒是不妨考虑选用。我本人对fortran也不熟悉,用得顺手的还是C/C++以及matlab。
发表于 2011-4-5 21:00:22 | 显示全部楼层 来自 湖北武汉
把这个老帖子翻出来,有没有人能把fortran调用c++的步骤给解释一下啊?
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-10-4 23:31 , Processed in 0.047022 second(s), 17 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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