F77与C++混合 < >我想从F77主程序调用C++函数。我在主程序中定义了: DOUBLE PRECISION FC34F, bf_Fc34F

F77与C++混合 < >我想从F77主程序调用C++函数。我在主程序中定义了: DOUBLE PRECISION FC34F, bf_Fc34F,c++,c,fortran,fortran77,fortran-iso-c-binding,C++,C,Fortran,Fortran77,Fortran Iso C Binding,打个电话,就像 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,主程序没有,因此我得到了一个未定义的引用错误 有人知道如何克服这个问题吗?< /P> < P>你的C++文件

打个电话,就像

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,主程序没有,因此我得到了一个未定义的引用错误


有人知道如何克服这个问题吗?< /P> < P>你的C++文件需要使用ExtC来禁用C++名字的修改:

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

您需要处理Fortran和C++两个方面的互操作性-主要命名为MULLY:

从C++使用外部C 从Fortran中定义一个显式接口,该接口指向指定bindC并使用可互操作类型的函数 C++代码:

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

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

执行:


/exe

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

您可能需要像这样调整两侧呼叫约定。 对于C功能添加u stdcall:


< Fortran标记此外部函数作为STDCAREL

是否成功编译C++代码?将双变量赋给字符串常量会阻止编译,更不用说链接了。您的函数是C函数。为什么使用C++编译器?此外,Fortran总是通过指针传递参数,因此您的C函数必须使用double*T作为参数。请显示详细信息。代码、编译器命令、错误消息。它们很重要。你需要C++中的外部C。你需要对待名字的污点。这里有许多类似的问题。特别是在链接中。相关/重复?或者只需查看“相关”下的右侧,或搜索[c++][fortan]以查看更多示例。这在这里并不是什么新鲜事。Fortran-c的互操作性更容易与现代功能,特别是ISO_c_绑定。你真的只限于F77吗?我对此表示怀疑。由于评论中提到的原因,此代码将失败。你只做了所需步骤中的一步。这确实是一个简单的问题,有许多重复项。还请注意,在Fortran编译器中有几种名称损坏方案。值得注意的是,bindc、interface、iso_c_绑定和种类与Fortran 77不兼容。不管怎样,我都会尽量使用它。这是非标准的,ysSTDLCAL不是ISO C++,使用EXCENC C和不正确的,无论是Y.StdLead,还是ExtEnter C都指定FORTRAN调用约定。例如,尽管它很旧:我不知道它们所指的是哪个编译器,但当指令请求时,普通编译器将执行stdcall onpy。幸运的是,在64位的时代,这并不重要。
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
double __stdcall bf_Fc34F_( double T ){
    T="some_mathematical_expression";
    return T;
}