F77和C++混合

anf*_*fho -1 c c++ fortran fortran77 fortran-iso-c-binding

我想从F77主程序中调用C++函数.我已在主程序中定义:

DOUBLE PRECISION FC34F, bf_Fc34F
Run Code Online (Sandbox Code Playgroud)

并打个电话

FC34F = bf_Fc34F( temp )
Run Code Online (Sandbox Code Playgroud)

函数bf_Fc34F是*.C文件中的C函数,定义为

double bf_Fc34F_( double T ){
  T="some_mathematical_expression";
  return T;
}
Run Code Online (Sandbox Code Playgroud)

我正在使用g ++/gfortran,当编译*.C文件(g ++ -c*.C)时,*.o文件附加了一个尾随的"_d"(我认为是"双"),主程序执行没有,因此我得到一个"未定义的引用"错误.

有谁知道如何克服这个问题?

小智 5

您需要处理Fortran和C++方面的互操作性 - 主要是名称修改:

  • 从C++开始使用 extern "C"
  • 从Fortran定义了指向bind(C)和使用可互操作类型的函数的显式接口

C++代码:

#include<iostream>
using namespace std;
extern "C" {
    double bf_Fc34F( double T ){
        T=T*T;
        cout << " from c++ - T: " << T << endl;
        return T;
    }
}
Run Code Online (Sandbox Code Playgroud)

Fortran代码:

program fc34f_test

    double precision FC34F

    interface
        function bf_Fc34F(T) bind(C,name="bf_Fc34F")
           use iso_c_binding
           real(C_DOUBLE) :: bf_Fc34F
           real(C_DOUBLE), value :: T
        end function
    endinterface

    FC34F = bf_Fc34F(2.d0)

    print*,"from Fortran - FC34F: ", FC34F

end program fc34f_test
Run Code Online (Sandbox Code Playgroud)

编译:

g++ -c fun.C ; gfortran -c main.f90 ; g++ fun.o main.o -o exe -lgfortran

执行:

./exe