我想从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”(我认为是“ double”),这是主程序执行的没有,因此我收到“未定义的引用”错误。

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

最佳答案

您需要从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

关于c++ - F77和C++混合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43927334/

10-08 22:12