将Fortran 77程序与C ++ DLL连接起来

时间:2012-11-27 23:35:52

标签: c++ gcc dllexport fortran77

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

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

关于如何链接&的一些逐步解释。使用c ++ dll编译fortran 77文件会很棒。我搜索了很多,并且是混合编程的新手。

2 个答案:

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

答案 1 :(得分:0)

这是一个调用C ++的fortran程序。请注意,接口必须位于extern“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++