1

我正在阅读这个 SO 问题:Linking fortran and c++ binaries using gcc

有人可以解释一下是否可以用 C++ 用 fortran 77 做类似的事情?
我需要从 fortran 77 文件中提取一些子例程并将它们转换为 C++ dll。新创建的 dll 需要使用旧的 fortran 77 文件。

关于如何使用 c++ dll 链接和编译 fortran 77 文件的一些分步说明会很棒。我进行了很多搜索,并且是混合编程的新手。

4

2 回答 2

0

这是一个调用 C++ 的 fortran 程序。请注意,接口必须位于外部“C”中,否则链接器将找不到它们。

1) 创建一个名为 worker.cpp 的 C 例程。注意例程名称后面的下划线。

#include <iostream>
extern "C"
{
extern void __attribute__((stdcall)) worker_()
{
   std::cout << "Hey it works" << std::endl;
}
}

2) 创建一个名为 boss.for 的 Fortran 程序。请注意,调用 C 例程时没有尾随下划线。

      program main
      external worker
      print *, 'Calling C'
      call worker
      print *, 'Back to F77'
      stop
      end

3)编译C代码

g++ -c worker.cpp

4)编译并链接Fortran代码

gfortran boss.for worker.o -o fboss -L/usr/lib -lstdc++
于 2013-03-19T19:43:45.977 回答
0

将 C++ 链接到 Fortran 程序几乎是不可能的,因为名称混淆,除非所有内容都位于外部“C”中。或者,您可以使接口 extern "C" 和实现 C++。

这是如何将现有的 Fortran 库与 C++ 程序链接,这是另一篇文章的内容。

1) 创建一个 Fortran 子程序,比如 worker.for。这是 F77 所以记住前 6 个空格

      subroutine printhi
      print *, 'it works'
      end subroutine

2) 创建一个调用它的 C++ 程序,比如 boss.cpp。注意 Fortran 例程名称中的尾随下划线

#include <iostream>
// Avoid any name mangling
extern "C"
{
extern void __attribute__((stdcall)) printhi_(void);
}

int main()
{
   std::cout << "Calling fortran" << std::endl;
   printhi_();
   std::cout << "Returned to C++" << std::endl;
}

3) 构建 F77 例程

gfortran -c worker.for

4) 编译并链接 C++ 程序。添加 fortran 库以解析任何 fortran 特定位。

g++ boss.cpp worker.o -o cboss -L/usr/lib -lgfortran

5) 运行程序

./a.out
于 2013-03-19T05:31:07.400 回答