Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
3
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

@bluepost59

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

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でその都度一緒にコンパイルするほうがいいと思う。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
3
Help us understand the problem. What are the problem?