【问题标题】:F77 and C++ mixingF77 和 C++ 混合
【发布时间】:2017-05-11 23:54:15
【问题描述】:

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

有人知道如何解决这个问题吗?

【问题讨论】:

  • C++代码编译成功了吗?将double 变量分配给字符串常量应该可以防止编译,更不用说链接了。
  • 你的函数是一个 C 函数。为什么要使用 C++ 编译器?另外,Fortran 总是通过指针传递参数,所以你的 C 函数必须以double *T 作为参数。
  • 请显示详细信息。代码、编译器命令、错误消息。它们很重要。你需要 C++ 中的extern "C"。您需要处理名称修改。这里有很多类似的问题。特别是在链接fortran-iso-c-binding.
  • 相关/(重复?)stackoverflow.com/questions/18491911/… stackoverflow.com/questions/18491911/… stackoverflow.com/questions/2495503/… 或直接查看相关下的右侧或搜索[c++] [fortan] 以查看更多示例。这真的不是什么新鲜事。
  • Fortran-c 的互操作性与现代特性非常容易,尤其是ISO_C_BINDING。你真的只限F77吗?我对此表示怀疑。

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


【解决方案1】:

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

【讨论】:

  • 值得注意的是,bind(c)、interface、iso_c_binding 和 kind 与 Fortran 77 不兼容。我会尽可能地尝试使用它。
【解决方案2】:

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

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

【讨论】:

  • 由于 cmets 中提到的原因,此代码将失败。您只完成了所需的更多步骤之一。这确实是一个有许多重复项的简单问题。
  • 另请注意,Fortran 编译器中存在多种名称修饰方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多