2011年08月03日

2011年08月03日:gfortran でハマる

 gfortran (リンクは R-Project 中のページ)でお仕事用のツールをいろいろ作っていたのだが、うかつなことにバイナリが libgfortran.dylib にリンクされていることを失念していた。これじゃ他のマシンに持って行ったときに動かないじゃん。静的リンクにしなくっちゃ、と思って調べ始めたのだが、これが実はメチャクチャ面倒であることが判明。試行錯誤の結果、一応次の手順を確立した。

 その1:libgfortran.dylibをリネームする。

% cd /usr/local/lib % sudo mv libgfortran.dylib libgfortran_.dylib % sudo cp libgfortran.a libgfortran.orig.a % sudo strip -S libgfortran.a % sudo ranlib libgfortran.a

 4行目は、"can't find atom for N_GSYM stabs" という警告を避けるため。Makefile に修正が要らないので簡便だが、今まで作った libgfortran.dylib 依存のバイナリが動かなくなるという罠がある。

 その2:静的ライブラリを別名(libgfortran-static.aなど)にしておき、リンクオプションでデフォルトのライブラリを禁止して、静的ライブラリを明示的に指定する。

% gfortran test.f -o test -nodefaultlibs -lgfortran-static -lgcc -lc -lm \ > -lSystem -lSystemStubs -lgfortranbegin # \ と > は入力不要。

 これも /usr/local/lib に手入れが必要。

% cd /usr/local/lib % sudo cp libgfortran.a libgfortran-static.a % sudo strip -S /usr/local/lib/libgfortran-static.a % sudo ranlib libgfortran-static.a

 Makefile は、gfortran でリンクしているところを探し出して、一つ一つ上記のリンクオプションをつける。面倒がって FC = gfortran -nodefaultlibs -lgfortran-static ... などとやってしまうと、コンパイルだけの行でいちいち大量に警告が出るのでよろしくない。

Posted at 2011年08月03日 00:52:16
email.png