当函数被放入使用" 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 <iostream>
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
而&#34; gfortran -o testf90 testf.o tt.a&#34;和&#34; g ++ tt.o testcpp.o -o testcpp -lgfortran&#34;产生一个可工作的可执行文件,&#34; g ++ -L $(p)-ltt testcpp.o -o testcpp -lgfortran&#34;崩溃
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)不是一种选择。
答案 0 :(得分:2)
您必须在使用其中定义的符号的目标文件之后指定库,即
g++ -o testcpp testcpp.o -L. -ltt -lgfortran