从c ++

时间:2016-08-17 06:04:46

标签: c++ 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 <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)不是一种选择。

1 个答案:

答案 0 :(得分:2)

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

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