web-dev-qa-db-ja.com

gccを使用してFortranおよびC ++バイナリをリンクする

Gccを使用してCとC++の間、またはCとFortranの間でそれぞれg ++またはgfortranを使用して呼び出しを行うことができます。しかし、C++とFortran間でプロシージャコールを行おうとすると、g ++またはgfortranでコンパイルするとエラーが発生します。どちらも他の必要なライブラリーを認識していないためです。

C++とFortranの両方で書かれたソースコードを使用するプロジェクトをリンクするにはどうすればよいですか?

$ cat print_hi.f90
subroutine print_hi() bind(C)
  implicit none
  write(*,*) "Hello from Fortran."
end subroutine print_hi

$ cat main.cpp
#include <iostream>

extern "C" void print_hi(void);

using namespace std;

int main() {
  print_hi();
  cout << "Hello from C++" << endl;
  return 0;
}
$ gfortran -c print_hi.f90 -o print_hi.o
$ g++ -c main.cpp -o main.o

私はg ++とリンクしてみます:

$ g++ main.o print_hi.o -o main
print_hi.o: In function `print_hi':
print_hi.f90:(.text+0x3f): undefined reference to `_gfortran_st_write'

未定義の参照に関するエラー。

そしてgfortranで:

$ gfortran main.o print_hi.o -o main
main.o: In function `main':
main.cpp:(.text+0xf): undefined reference to `std::cout'

...など。

Gfortranライブラリとg ++ライブラリを使用してバイナリをリンクするにはどうすればよいですか?

39
sverre

標準のFortranライブラリにリンクするg++ main.o print_hi.o -o main -lgfortranを探しています。

-lstdc++を渡してgfortranを使用することもできます。

60
Jonathan Dursi