c++调用fortran程序库主要有两种方法,下面以在windows+mingw(g77,g95)下的例子进行说明:
1. 静态连接
首先要注意fortran和C++程序中函数名称的不同,下面是fortran函数FUNC_NAME编译后的名称:
gcc func_name
pgcc func_name
g77 func_name_
pgf77 func_name_
absf77 func_name
因此,当fortran程序用g77编译时,在c++程序中函数要小写并在右边加下画线。
下面是调用例子。
c fortran程序fr1.f
SUBROUTINE FR1(N,M,CSTR)
INTEGER*4 CSTR(1)
C HERE WE RECEIVE THE C CHAR STRING IN AN INTEGER ARRAY
C COULD ALSO HAVE USED A BYTE ARRAY
M=N*N
WRITE(6,20) (CSTR(L),L=1,3)
20 FORMAT(' CSTR=',3A4)
WRITE(6,*) 'DONE'
RETURN
END
#c++调用程序callfr1.cpp
#include <iostream>
#include <string>
using namespace std;
extern "C"
{
void fr1_(int *,int *,char *); //注意函数名是小写
}
int main()
{
int n=10,nSq;
char szCtest[20];
strcpy(szCtest,"teststring");
fr1_(&n,&nSq,szCtest);
cout << "The square is:" << nSq << endl;
return 0;
}
编译连接方法:
gcc -c callfr1.cpp
g77 -c fr1.f -o fr1.o
ar -r libfr1.a fr1.o c:/mingw/lib/g95main.o
gcc -o callfr1.exe callfr1.cpp -lstdc++ -lfr1 -lf95
2. 动态连接
首先编译动态链接库
gcc -shared -o libfr1.dll fr1.f -lg2c
pexports libfr1.dll > libfr1.def
dlltool --dllname libfr1.dll --def libfr1.def --output-lib libfr1.a
其次编译C++程序
gcc -c callfr1.cpp
gcc -o callfr1.exe callfr1.cpp -lstdc++ -lfr1 -lf95