fortranにはライブラリを構築する機能がある。しかしどうもかなり癖のあるものだった、という話。
静的ライブラリを作る
まずライブラリを作るにあたって、ソースコードに特別な文法は特に必要ない。moduleで作ればよい。
ライブラリをビルドするときは、通常のコンパイルと異なり、以下の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しかまとめることができないらしい。定数はおろか構造体やクラスもまとめることができない。
たとえば以下のモジュールをライブラリ化したとする。
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でその都度一緒にコンパイルするほうがいいと思う。