MinGWでライブラリを静的リンクする方法
MinGWというGNUコンパイラシステムを使う。GPLライセンスのオープンソースなので、コンパイラをコンパイルすることから行った。
参考:sixnine.net - このウェブサイトは販売用です! - 表現 正規 ちゃん 講座 キー システム ファイル ブラウザ リソースおよび情報
今回はこの中のFortranコンパイラgfortranを使う。Windows上で、gfortranによるコンパイルを行うが、Linuxのように使いたいのでMSYSシェルから実行する。普通に、gfortranコマンドでコンパイルできる。
$ gfortran -o a.out test.f
64bitのWindows上で、32bit用の実行モジュールを作成するには、
$ mingw32-gfortran -o a.out test.f
とする。このようにクロスコンパイルにも対応している。
このように作成された実行モジュールは、DLLをリンクしているので、MinGWがインストールされていない環境へ持っていくと実行できない。
また,最近のMinGWの出力するバイナリはMinGWのDLLファイルをリンクするようです.つまりMinGWがない環境では出力されたバイナリは実行できない,ということです.これを回避するために必要なライブラリを静的リンクするように"-static-libgcc","-static-libstdc++"オプションを指定してやります.
空が狭い: MinGWでBoostをコンパイル
このエントリーを参考にして、gfortranの場合もいろいろ試した結果、以下のようにするとうまくいくようだ。
$ gfortran -o a.out -static-libgfortran -static-libgcc test.f
- static-libgccの方もないと、MinGWがインストールされていない環境では実行できない。