"fortranの静的ライブラリと問題点"
https://qiita.com/blu_epos_t59/items/1a88230698f5de9cb615
という記事に、Fortranの静的ライブラリを作る記事があるが、
ただし、調べてみたところどうやら読まれるのは宣言部、つまりcontains以下のみであり、subroutineしかまとめることができないらしい。定数はおろか構造体やクラスもまとめることができない。
及び、
なので、moduleのソースをどこかにまとめて置いておいてmakefileでその都度一緒にコンパイルするほうがいいと思う。
とあった。これではmoduleを使った場合に非常に面倒なので、2019年現在どうなっているか調べてみた。
バージョン
gcc version 7.2.0 (Homebrew GCC 7.2.0_1)
コード
記事にあるものと同じ、単純なモジュールを考える。
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
また、Makefileを
all:mylib.f90
gfortran -c mylib.f90 -o mylib.o
ar cr libmylib.a mylib.o
とした。
これをtest
ディレクトリに置く。そして、
program main
use mylib
implicit none
type(myclass)::a
write(*,*) mynum
a%id = 4
write(*,*) a%id
call myroutine()
end
をその上のディレクトリに置いてみよう。つまり、
test test.f90
で、testの中身は
Makefile mylib.f90
という状況とする。
make
testディレクトリ内で
make
をすると、
ls
Makefile libmylib.a mylib.f90 mylib.mod mylib.o
となる。次に、その上のtest.f90
のあるディレクトリに行って、
gfortran test.f90 -L./test/ -lmylib
としてみたが、
test.f90:2:8:
use mylib
1
Fatal Error: Can't open module file 'mylib.mod' for reading at (1): No such file or directory
compilation terminated.
というエラーが出た。つまり、moduleを探すことができていない。
そこで、
https://software.intel.com/en-us/forums/intel-fortran-compiler-for-linux-and-mac-os-x/topic/510065
を参考にして、
gfortran test.f90 -L./test/ -I./test -lmylib
とすると、ちゃんとコンパイルできて、出力は
./a.out
100
4
hello world!
となった。
まとめ
今回使ったgfortranのバージョンでは、記事の問題を再現できなかった。一方、modがないと言われる件に関しては、Iオプションをつけることで解決することができた。