MinGW(5)今更MinGW(5)gcc4.2.1MinGWのCurrent(現行バージョン)はgcc3.4.5だ。Previewにはgcc4.2.1があり、こちらを使いたい場合もあるだろう。猫科研究所でも、特に問題がない場合はgcc4.2.1で解説していくつもりだ。2007/04/03追記:gcc4.2.1は問題ない箇所でエラーを報告するなど若干不安定で、出来上がるバイナリも大きくなることが多い。標準のgcc3.4.5を推奨する。ここではgcc4.2.1を入れ、かつ標準のgcc3.4.5と共存させる手順を解説する。共存させるのはgcc/g++のみで、javaやObjective-Cのことは考慮していない。MinGWの最初のインストールで最新版を入れた場合は初めから4.2.1になっているだろうから、この手順は不要だ。ファイル名のバッティングMinGWのgcc3.4.5とgcc4.2.1で、直接ファイル名がバッティングするのは以下の通り。COPYINGCOPYING.LIBlib/libiberty.ainfo/cppinfo/cppinternalsinfo/gccinfo/gccinstallinfo/gccintman/man1/cppman/man1/g++man/man1/gccman/man1/gcovman/man7/fsf-fundingman/man7/gfdlman/man7/gplこれらを除けば、単純にgcc4.2.1のアーカイブを展開してもファイルの上書きはない。運用上gcc.exeやg++.exeなどがバージョン名付きだと、毎回configure/Makefileの書き換えやオプション指定が必要で面倒だ。これらも同時に対処したいところだろう。これらコンパイラコマンドで運用上ファイル名がバッティングするのは以下の通り。bin/c++bin/cppbin/g++bin/gccbin/gcovbin/mingw32-c++bin/mingw32-g++bin/mingw32-gccbin/gccbugここでは、これらのファイルに全てバージョン名を付け、シェルスクリプト一発で切り替えられるようにする。手順は以下の通り既存のgcc3.4.5系のファイルをバージョン(3.4.5)付きファイル名へとコピーするgcc4.2.1系のファイルを取得・展開し、バージョン(sjlj)付きファイル名へとリネームする両者をバージョン名付きファイルからの上書きコピーで切り替えられるようにするgcc3.4.5のコピーまずはgcc3.4.5の上記ファイルをバージョンの付いたファイル名へとコピーする。面倒かつ長くなるなのでシェルスクリプトにした。mingw-gcc4-installer.tar.bz2(2052)を取得し、展開して実行する。mingw-gcc4-installer/escapegcc3.sh下記のように実行してみればバージョン付きファイル名へのコピーを確認できる。special)なお、このスクリプトはMSYS上で/mingwにMinGWがインストールされている前提だ。標準的な環境では問題ないはずだが、環境を変更している場合は注意されたい。Previewからgcc-core-4.2.1-sjlj-2.tar.gzとgcc-g++-4.2.1-sjlj-2.tar.gzを取得し、これらを作業ディレクトリ(ここではgcc4とした)へ展開する。gcc4次に、バッティングするファイルのリネームを行う。先ほどのmingw-gcc4-installer.tar.bz2(2052)に含まれるスクリプトで可能だ。gcc4先ほどの作業ディレクトリを引数に与えていることに注意。/mingw/などとしてインストールしよう。念のためにcpコマンドにはiオプションを付している。万が一、上書き表示が出る場合には上書きせずにリネームしてからコピーすること。切り替え両者の切り替えは先ほどのmingw-gcc4-installer.tar.bz2(2052)に含まれるスクリプトで行う。-vと実行してgccのバージョンを確認してみると良い。切り替えスクリプトgccswitchは/mingw/binあたりにコピーしておくと良いだろう。その他MinGWのgcc4.2.1に関する細かな情報を書いておく。リリースノートからの情報である。sjljとはSetjump-longjumpの略で、gccでビルドしたプログラムでの、例外の取り扱い方式の名前。他にもDwarf2という方式がある。sjljはこれまでのMinGWで使われており、現状ではデフォルトの方式。Dwarf2方式はテーブルベースの方式で、より効果的とされる。これらのモデルはプログラム中で混在させてはならない。sjljでビルドしたライブラリとDwarf2でビルドしたメインプログラムを結合してはならない。gccのバージョン間のライブラリ整合に関してコンパイラの標準リンクライブラリは、基本的には/libまたは/libexec以下でバージョンごとのディレクトリに別れているので、あまり注意する必要はない。mingw-runtimeとw32apilibstdc++はmingw-runtime3.13とw32api2.2を必要とする。MinGWのCurrentはこれを満たしているので気にする必要はない。OpenMPOpenMPが有効。これを使用するにはwin32-pthreadsが必要となる。猫科研究所ではwin32-pthreadsに関して別ページにて解説する予定。(2008/05/03追記:MinGW+ffmpeg(5)pthreadとMinGW+ffmpeg(A)pthreadは複雑にて解説しました。)dll/exeを跨ぐC++例外C++に於いて、dll/exeを跨ぐ例外を投げるには共有ランタイムライブラリのlibgccとlibstdc++にリンクする必要がある。これを有効にするには-shared-libgccと-lstdc++_sをコマンドオプションに加える。将来的には静的なライブラリと共有ランタイムライブラリを選択可能な仕組みを入れる予定とされている。猫科研究所の記事では、必要に迫られない限り静的ライブラリを使用する。Perl5.010001。