MinGW GCC-3.4.5を今風にインストールする

2015/07/16 (amendment: 2015/09/23)

Microsoftが条件付きながら無償版コンパイラを提供し、Clangもある昨今、WindowsプログラミングにMinGW (Minimalist GNU for Windows) のGCCを使う人はきわめて少数派でしょう。
が、Windows上でFORTRANやFortran(注:全部大文字は77迄、小文字交じりは90以降を表すのが慣例)を扱うにあたり、Intelの高価なコンパイラを買わないのであれば、現状ではMinGW-GCCが事実上唯一の選択肢となります。更にその場合でGCCの最新版を使いたくない/使えないケースが時々あります。具体的には:

本質的には、Fortranの記述を全部Cに書き換えて他のコンパイラに引っ越す以外に合法的解決手段はありません。しかし、古いプログラムのメンテナンス等でFORTRAN77+GNU拡張レベルだけでよい場合、古いGCC-3.4.5の g77 を使うことが、辛うじて解決手段のひとつになり得ます。(g77 のランタイム libg2c は Netlib の libf2c 由来でありMIT licence相当)
FORTRAN77で実現できない現代的な機能は、面倒事は多々あるものの、GCC-3.4.5でもC言語(C89と一部のC99)/C++(C++03)との混合言語プログラミングにより、かなりのことがカバーできます。後々のことを考えると決して推奨できる手段ではないが、様々な事情で現実的対処方法が他にないなら、しかたありません。

しかし、GCC-3.4.5を使うためには、今時のMinGW公式サイトインストーラー mingw-get-setup.exe のお任せだけではうまくいきません。

この向きのMinGWのインストールに関することはググるとぽつぽつと出ては来るのですが、インストール方法がまとまって書かれたところが意外にも無いようなので、少し書いてみます。

[2015/11/01] gccで何かコンパイルして、その下位で呼び出されるas.exeが libgcc_s_dw2-1.dll が無いと言って動かない場合、インストール済みのbinフォルダにあるインストーラー mingw-get.exeを起動し、gcc-core-4.8.1-4-mingw32-dll.tar.lzmaを取得・インストールすれば大丈夫です。(この方法でインストールしたときのbinutilの各種バイナリがほぼこれに依存している模様)

[2016/06/04] GNU拡張も使っていない厳格なFORTRAN77範囲内なら、f2cを使う方法もあります。64bit対応もできます。

[2020/08/30] GCC-3.4.5 付属の libstdc++-v3 にはいろいろとバグがあるようです。GCC-3.4.6(バイナリは配布されていない)のソースでもこの辺りは変わっていないらしい。


途中までは、MinGW公式サイトインストーラー mingw-get-setup.exe が使えます。
まず、Basic Setupにおいてmingw32-baseとmsys-baseを選択します。

デフォルトではバイナリとして「mingw32-gcc-何々」の最新版(画像では4.8.1)が選択されていますが、それをすべて外し、「mingw32-gcc-v3-何々」(3.4.5はGCC-3系列の事実上最後の安定版で、選択肢はこれしかない)を選択します。ここではcore、g++、fortranの3つを選択しています。adaやobjcは使った事がありません。manやdocはないみたいです。

ただし、ランタイムライブラリ「mingw32-mingwrt」の3.20以降のコンパイル済みバイナリはGCC-3.4.5と互換性がない※ため、古い物を使います。(情報出典 http://stackoverflow.com/questions/18649173/how-to-solve-undefined-reference-to-chkstk-ms-on-mingw

※gcc-4.5.2を境にして、コンパイル済みライブラリの互換性がないためのようです(mingw-getでlibpthreadの選択肢を見るとこの説明が載っている)。
同じ情報出典をよく読むと「gcc-3.4.5でビルドし直したmingw32-mingwrtを使えばよい」(FWIW, I can reproduce your issue if I install a GCC-4.8.2 built mingwrt-3.21.1 into a GCC-3.4.5 installation. By the same token, I can also successfully use mingwrt-3.21.1 with GCC-3.4.5, if I build it with that same version of GCC.)というコメントが付けられています。(→ビルドのみ試行
兎に角、ここではmingw32-mingwrt 3.21のチェックを全部外します。

結局、以下のものを選択することになります。

ところが、インストーラーの設定ではmingw32-mingwrtの古い物が表示されません。しかたがないのでSourceForge.netの http://sourceforge.net/projects/mingw/files/MinGW/Base/mingwrt/ から mingwrt-3.18 のdllとdevを直接ダウンロードします。net上の情報では、この3.18が、どうやらgcc-3.xと互換性がある最後のコンパイル済みバイナリのようです(3.19バイナリを確かめたわけではないので、あくまで参考まで)。また、http://stackoverflow.com/questions/18649173/how-to-solve-undefined-reference-to-chkstk-ms-on-mingw には mingw-get upgrade "mingwrt=3.18.*" でインストールできると書いてあるものの、実際に試してみると失敗しますので、手動でやるしかないようです。

これらをtar.gzを展開できるアーカイバで展開し、インストール先に上書きします。以上で、構築完了です。なお、この場合、インストーラー mingw-get-setup が後から把握できるバージョン管理/インストール/アンインストール情報が入らないので、環境をメンテナンスする際には注意してください。

C/C++ における Shift JIS ソースコードへの対処

参考 http://seclan.dll.jp/dtdiary/2009/dt20090324.htm その他、「gcc 3.4.5 shift jis」で検索。なお、FORTRAN77 しか使わない場合はこの対応をしなくても -fno-backslash を指定するだけで十分だが、FORTRAN77 と C/C++ の混合プログラミングとなる場合は C/C++ 側の事情と合わせるため対処が必要。

gcc-v3-*-3.4.5-20060117-3-mingw32 のシリーズでは、libiconv がリンクされていないため、Shift JIS のソースコードが通らない。古いファイル gcc-core-3.4.5-20060117-1-vista.tar.gz を持ってきてその中の libexec/gcc/mingw32/3.4.5/cc1.exe で上書きする必要がある。C++ と f77 も同様に gcc-g++-3.4.5-20060117-1-vista.tar.gz gcc-g77-3.4.5-20060117-1-vista.tar.gz の libexec/gcc/mingw32/3.4.5/cc1plus.exe および libexec/gcc/mingw32/3.4.5/f771.exe で上書きする。

g++ -finput-charset=cp932 -fexec-charset=cp932 -Wall foobar.cpp または g++ --input-charset=CP932 --exec-charset=cp932 -Wall foobar.cpp


略歴


トップページ / 計算機関係の雑多なこと / GCC-3.4.5を今風にインストールする
このサイトについて・著者連絡先