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がインストールされていない環境では実行できない。