从c ++调用FORTRAN库的问题

当函数被放入用“ar rcs”创建的库中时,我遇到从C ++调用FORTRAN子例程的问题。

FORTRAN例程(tt.f90)是:

Module A contains Subroutine SubIF2(ii) Integer*8, Intent(In) :: ii write(*,*) "hello", ii End Subroutine SubIF2 End Module A 

一个c ++调用者(testcpp.cpp)代码是

 #include  using namespace std; extern"C" { void __a_MOD_subif2(long long int *ii); } main(){ long long int ii=5; __a_MOD_subif2(&ii); return 0; } 

fortran调用者(testf.f90)代码是

 Program test use A integer*8 :: i=1 call SubIF2(i) End Program test 

makefile是

 p=/PathToMyWorkDirectory all: gfortran -c tt.f90 ar rcs libtt.a tt.o g++ -c testcpp.cpp gfortran -c testf.f90 -gfortran -o testf90 testf.o tt.a -g++ tt.o testcpp.o -o testcpp -lgfortran -g++ -L$(p) -ltt testcpp.o -o testcpp -lgfortran clean: -rm *.o *.mod -rm testf90 -rm testcpp 

虽然“gfortran -o testf90 testf.o tt.a”和“g ++ tt.o testcpp.o -o testcpp -lgfortran”产生了可执行的可执行文件,但“g ++ -L $(p)-ltt testcpp.o -o testcpp -lgfortran“崩溃了

 testcpp.o: In function `main': testcpp.cpp:(.text+0x18): undefined reference to `__a_MOD_subif2' collect2: error: ld returned 1 exit status 

由于链接适用于fortran可执行文件,因此我无法在库创建中看到任何错误。

知道我在这里失踪了吗?

非常感谢。

注意:最终的fortran函数都是二进制的,因此调整fortran代码(例如iso_c_binding)不是一个选项。

你必须在使用其中定义的符号的目标文件之后指定库,即

 g++ -o testcpp testcpp.o -L. -ltt -lgfortran