F77和C ++混合

时间:2017-05-11 23:54:16

标签: c++ c fortran fortran77 fortran-iso-c-binding

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

DOUBLE PRECISION FC34F, bf_Fc34F

并拨打电话

FC34F = bf_Fc34F( temp )

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

double bf_Fc34F_( double T ){
  T="some_mathematical_expression";
  return T;
}

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

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

3 个答案:

答案 0 :(得分: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;
    }
}

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

编译:

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

执行:

./exe

答案 1 :(得分:0)

您的C ++文件需要使用extern "C"来禁用C ++名称修改:

extern "C" {
double bf_Fc34F_( double T ){
  T="some_mathematical_expression";
  return T;
}
} // extern "C"

答案 2 :(得分:-1)

对象.o文件中的函数名称以及向其发送/接收参数的方法取决于所选的calling convention

您可能需要调整here这样的旁边通话约定。 对于C函数,添加 __ stdcall

double __stdcall bf_Fc34F_( double T ){
    T="some_mathematical_expression";
    return T;
}
Fortran中的

将此外部函数标记为 STDCALL