gcc4.2.1
MinGWのCurrent(現行バージョン)はgcc3.4.5だ。
$ gcc -v Reading specs from c:/MinGW/bin/../lib/gcc/mingw32/3.4.5/specs (中略) Thread model: win32 gcc version 3.4.5 (mingw special)
MinGWリリースページのTechnology 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で、直接ファイル名がバッティングするのは以下の通り。
COPYING COPYING.LIB lib/libiberty.a info/cpp info/cppinternals info/gcc info/gccinstall info/gccint man/man1/cpp man/man1/g++ man/man1/gcc man/man1/gcov man/man7/fsf-funding man/man7/gfdl man/man7/gpl
これらを除けば、単純にgcc4.2.1のアーカイブを展開してもファイルの上書きはない。しかし、運用上gcc.exeやg++.exeなどがバージョン名付きだと、毎回configure/Makefileの書き換えやオプション指定が必要で面倒だ。これらも同時に対処したいところだろう。
これらコンパイラコマンドで運用上ファイル名がバッティングするのは以下の通り。
bin/c++ bin/cpp bin/g++ bin/gcc bin/gcov bin/mingw32-c++ bin/mingw32-g++ bin/mingw32-gcc bin/gccbug
ここでは、これらのファイルに全てバージョン名を付け、シェルスクリプト一発で切り替えられるようにする。
手順は以下の通り
- 既存のgcc3.4.5系のファイルをバージョン(3.4.5)付きファイル名へとコピーする
- gcc4.2.1系のファイルを取得・展開し、バージョン(sjlj)付きファイル名へとリネームする
- 両者をバージョン名付きファイルからの上書きコピーで切り替えられるようにする
gcc3.4.5のコピー
まずはgcc3.4.5の上記ファイルをバージョンの付いたファイル名へとコピーする。面倒かつ長くなるなのでシェルスクリプトにした。mingw-gcc4-installer.tar.bz2(2867)を取得し、展開して実行する。
$ tar xvfj mingw-gcc4-installer.tar.bz2 $ mingw-gcc4-installer/escapegcc3.sh
下記のように実行してみればバージョン付きファイル名へのコピーを確認できる。
$ gcc-3.4.5 -v Reading specs from c:/MinGW/bin/../lib/gcc/mingw32/3.4.5/specs (中略) Thread model: win32 gcc version 3.4.5 (mingw special)
なお、このスクリプトはMSYS上で/mingwにMinGWがインストールされている前提だ。標準的な環境では問題ないはずだが、環境を変更している場合は注意されたい。
gcc4.2.1のリネーム
MinGWリリースページのTechnology Previewからgcc-core-4.2.1-sjlj-2.tar.gzとgcc-g++-4.2.1-sjlj-2.tar.gzを取得し、これらを作業ディレクトリ(ここではgcc4とした)へ展開する。
$ mkdir gcc4 $ tar xvfz gcc-core-4.2.1-sjlj-2.tar.gz -C gcc4 $ tar xvfz gcc-g++-4.2.1-sjlj-2.tar.gz -C gcc4
次に、バッティングするファイルのリネームを行う。先ほどのmingw-gcc4-installer.tar.bz2(2867)に含まれるスクリプトで可能だ。
$ mingw-gcc4-installer/escapegcc4.sh gcc4
先ほどの作業ディレクトリを引数に与えていることに注意。前述のバッティングするファイル名が変換されていることを確認したら、
$ cp -ipr gcc4/* /mingw/
などとしてインストールしよう。念のためにcpコマンドにはiオプションを付している。万が一、上書き表示が出る場合には上書きせずにリネームしてからコピーすること。
切り替え
両者の切り替えは先ほどのmingw-gcc4-installer.tar.bz2(2867)に含まれるスクリプトで行う。gcc3.4.5に切り替えたい場合は
$ gccswitch 3
gcc4.2.1に切り替えたい場合は
$ gccswitch 4
とする。それぞれ、
$ gcc -v
と実行してgccのバージョンを確認してみると良い。切り替えスクリプトgccswitchは/mingw/binあたりにコピーしておくと良いだろう。
その他
MinGWのgcc4.2.1に関する細かな情報を書いておく。主にリリースノートからの情報である。
sjljとは
Setjump-longjumpの略で、gccでビルドしたプログラムでの、例外の取り扱い方式の名前。他にもDwarf2という方式がある。sjljはこれまでのMinGWで使われており、現状ではデフォルトの方式。Dwarf2方式はテーブルベースの方式で、より効果的とされる。
これらのモデルはプログラム中で混在させてはならない。例えばsjljでビルドしたライブラリとDwarf2でビルドしたメインプログラムを結合してはならない。
gccのバージョン間のライブラリ整合に関して
コンパイラの標準リンクライブラリは、基本的には/libまたは/libexec以下でバージョンごとのディレクトリに別れているので、あまり注意する必要はない。
mingw-runtimeとw32api
libstdc++はmingw-runtime3.13とw32api2.2を必要とする。MinGWのCurrentはこれを満たしているので気にする必要はない。
OpenMP
OpenMPが有効。これを使用するには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をコマンドオプションに加える。将来的には静的なライブラリと共有ランタイムライブラリを選択可能な仕組みを入れる予定とされている。
ただし、猫科研究所の記事では、必要に迫られない限り静的ライブラリを使用する。
最終更新時間:2008年05月03日 17時30分43秒