LoginSignup
1
4

More than 5 years have passed since last update.

fortranの静的ライブラリと問題点

Last updated at Posted at 2017-11-10

fortranにはライブラリを構築する機能がある。しかしどうもかなり癖のあるものだった、という話。

静的ライブラリを作る

まずライブラリを作るにあたって、ソースコードに特別な文法は特に必要ない。moduleで作ればよい。

ライブラリをビルドするときは、通常のコンパイルと異なり、以下のmakefileのようにする。

makefile
all:mylib.f90
   gfortran -c mylib.f90 -o mylib.o
   ar cr libmylib.a mylib.o

このとき生成するファイルはlib*.aという名前でなければならない。

静的ライブラリを使う

静的ライブラリを使うには、コンパイル時に次のようにする。
gfortran test.f90 -L$(mylibpath) -lmylib
このときmylibpathにはライブラリのあるパスをフルパスで入れる。順番を間違えるとリンクがうまくいかずエラーが出る。

問題点

ただし、調べてみたところどうやら読まれるのは宣言部、つまりcontains以下のみであり、subroutineしかまとめることができないらしい。定数はおろか構造体やクラスもまとめることができない。

たとえば以下のモジュールをライブラリ化したとする。

mylib.f90
module mylib
   implicit none
   integer :: mynum = 100
   type myclass
      integer :: id
   end type myclass
contains 
   subroutine myroutine()
      write(6,*) "hello world!"
   end subroutine myroutine
end module mylib

これを適切な方法でライブラリ化して参照しても、myroutineは使えるがmynumやmyclassを参照することはできず、エラーが出る。

どうやらライブラリ機能はfortranが生まれたときから変わっていないようで、pythonpathのように自動で検索してインポートしてくれるわけでもないので、あまりメリットを感じない。

その上、ソースコードにはuse文を使うでもないうえ、サブルーチンの名前くらいでしか何のライブラリの要素を使っているのかわからない。makefileを見ればわかるのだが、保守性は落ちると言わざるを得ない。

なので、moduleのソースをどこかにまとめて置いておいてmakefileでその都度一緒にコンパイルするほうがいいと思う。

1
4
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4