1

私はこのSOの質問を読んでいました: Linking fortran and c++ binaries using gcc .

Fortran 77 で C++ を使用して同様のことを行うことが可能かどうか、誰かが説明できますか?
Fortran 77 ファイルからいくつかのサブルーチンを抽出し、それらを C++ dll に変換する必要があります。新しく作成された dll は、古い fortran 77 ファイルで動作する必要があります。

Fortran 77ファイルをc ++ dllとリンクしてコンパイルする方法に関する段階的な説明は素晴らしいでしょう。私はたくさん検索しましたが、混合プログラミングの初心者です。

4

2 に答える 2

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 に答える
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++
于 2013-03-19T19:43:45.977 に答える