http://hi.baidu.com/linzch/blog/item/5f5e4d9021873884a977a48a.html
这里将详细介绍一下在C++中如何调用用Fortran语言编写函数的问题,即Fortran与C++的混合编程问题。
通常情况下,C++与Fortran的混合编程问题是利用动态链接库的方式进行的,换句话说,如果在C/C++中调用Fortran函数,应将Fortran函数按照一定的协议编译为动态链接库,然后即可实现二者的混合编程问题。实现这一目的有两种方式:显示链接与隐式链接,下面通过两个非常简单的实例分别介绍之。
编译环境:Fortran:推荐使用Compaq Visual Fortran 6.0以上的版本,C++:Microsoft
Visual C++6.0。
1. 显式链接,
(a) 找开CVF编译器,然后新建一个Fortran DLL工程(选择Fortran Dynamic Link
Library),并指定工程名,如下图所示:
按确定按钮,然后新建一个Fortran 源文件,并输入以下的Fortran代码:
(这里仅为说明问题,实际的问题比下面的代码要复杂得多。)
SUBROUTINE OUTPUT(N)
!必须声明本函数为输出函数:DLLEXPORT
!DEC$ ATTRIBUTES DLLEXPORT::OUTPUT
IMPLICIT NONE
INTEGER N
N=N+10
WRITE(*,*) "N=",n
END SUBROUTINE OUTPUT
经编译,链接后,将在Debug目录下生成两个文件,即dll文件与lib文件。
(b) 启动Visual C++6.0,然后新建一个console工程(即Win32 Console
Application,当然在MFC中也是完成可行的),如下图所示:
按确定按钮,新建一个空的工程后,再新建一个C++源文件,并输入以下的代码:
#include
#include
int main()
{
typedef void (_stdcall * wndProc)(int& );
HINSTANCE hLibrary=LoadLibrary("pp.dll"); //加载动态库文件
if(hLibrary==NULL)
{
cout<<"can't find the dll
file"<<endl;
return -1;
}
wndProc test=(wndProc)GetProcAddress(hLibrary,"OUTPUT");
//获得Fortran导出函数的地址
if(test==NULL)
{
cout<<"can't find the
function file."<<endl;
return -2;
}
int n=3;
test(n); //调用fortran函数</