- 积分
- 149
- 注册时间
- 2003-5-22
- 仿真币
-
- 最后登录
- 1970-1-1
|
发表于 2008-3-21 21:52:56
|
显示全部楼层
来自 新加坡
Fortran无法直接使用动态链接库(或者有些版本的fortran编译器,比如PGI,或Visual Fortran等有相关的扩展,不过我不了解)。长话短说,在fortran程序中,我们可以通过调用c语言的方式间接调用dll,具体的做法是我们为调用dll中的函数,另外在写一个和fortran兼容的c或c++语言的wrapper函数。这里牵涉到fortran和c/c++的混合编程,主要有两点需要注意的:- 1. Fortran程序中函数的参数是以地址的方式传递的。也就是说类似于
- subroutine foo(x, y, z)
- real x, y, z
- 其等效的c语言函数声明则类似
- void foo( float* x, float* y, float* z);
- 2. 有些fortran编译器比如g77,在编译函数后会在函数名的后面在多加一个下划线“_",也就是上面的subroutine foo编译后,函数名就变成了foo_。换句话说,如果在fortran中用
- call foo(...)
- 调用foo子函数,其实是找foo_。
复制代码 说起来好像挺烦的,不过做几次练习以后就熟悉了。
下面给出针对于我们的例子,也就是libmcctest01.dll中mcctest01函数的调用,一个可行的C++语言的wrapper函数:- // File: mcctest01wrap.cpp
- // Description: A simple testing c++ souce file. Two functions
- // are defined, which will be called in a FORTRAN 77 code.
- //
- // History: Created on 16 January, 2006
- // Created by: Dong Weiguo
- //////////////////////////////////////////////////////////////
- #include "libmcctest01.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 mymccfunc_()
- {
- libmcctest01Initialize();
- mlxMcctest01(0, NULL, 0, NULL);
- std::cout << "Press any key to quit!" << std::endl;
- getchar();
- libmcctest01Terminate();
- }
- // Another way to deal with this underscore thing is to
- // use some compiler flag to disable it. For example, we
- // can use "-fno-underscoring -fno-second-underscore" for
- // g77.
- extern "C" void mymccfunc()
- {
- libmcctest01Initialize();
- mlxMcctest01(0, NULL, 0, NULL);
- libmcctest01Terminate();
- }
复制代码 这样,我们只要在fortran程序中调用某个wrapper函数,比如mymccfunc_就可以了。下面是这个例子的fortran主程序:- C A test program to demonstrate how to call c++
- C functions from a Fortran program.
- C Synopsis: f77cpptst
- C History: 16 January, 2006
- C Created by: Dong Weiguo
- program f77cpptst
-
- call mymccfunc()
-
- stop
- end
复制代码 可以看出,程序非常简单,就是调用wrapper函数。接下来就开始介绍如何编译我们的例子。
[ 本帖最后由 taohe 于 2008-3-21 22:14 编辑 ] |
|