MinGW(64bit)を用意してみた

MinGW 64bitをインストールする

MinGWで作ったものを実行すると、タスクマネージャで*32が付いてしまう。つまり、32bitプログラムということだ。64bitプログラムを作ろうと思ってもオプションで、どうにかなるものではないらしい。どうやらMinGW-w64と言うのを使わなくてはならんらしい。
sezeroさん、ありがとうと思いつつ、既にバイナリ化してあるMinGW-w64をダウンロードする。
http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/sezero_4.5_20111101/
色々置かれているが、私の作ろうとしている環境は、MinGWなので、ダウンロードするべきものはmingw-w64-bin_x86_64-mingw_20111101_sezero.zipだ。
インストール先は、MinGWをC:\MinGWに入れているので、今回はC:\MinGW64にする。というか、zipの中はmingw64から始まっている。これをC:\MinGW64としコピーすれば、基本的には終わりらしい。ただ、なぜかpthreadsがpthreads-w64.zipとして分離して置かれている。多少気持ちが悪いが、これもC:\MinGW64直下にコピーしておく。
ちなみにPATHはMinGW(32bit)に通してしまっているので、コマンドプロンプトでMinGW64を使うのはあきらめて、MSYSで切り替えることにする。

MSYSをインストールする

MSYSのインストールを調べるとexeファイルがある事になっているが、msys-1.0.11までしか用意されていない。最新版を手動でインストールしていたら日が暮れてしまうので、MinGW(32bit)からMSYSフォルダーをコピーすることにした。強引な手だが、別にMSYSがバイナリを作るわけではないので、基本的には問題ないはずだ。ただし、そのまま使うとC:\MinGW(32bit)で動いてしまうので注意が必要だ。

ショートカットの作成

コマンドプロンプトで毎回msys.batを実行するのも面倒なので、スタート→MinGWMinGW Shellをコピーして、スタート→MinGW→MinGW64 Shellを作成する。忘れてはいけないのは、プロパティを変更してC:\MinGW64\MSYS\1.0\msys.batを実行することだ。と言うわけで次のように修正する。

リンク先
C:\MinGW64\msys\1.0\msys.bat
作業フォルダー
C:\MinGW64\msys\1.0\bin

これだけで良さそうにも見えるが、msys.batとMSYSはC:\MinGWを動かそうとするので、あと2ステップの修正が必要だ。

msys.batの修正

1回しか呼び出していないはずが、内部で自分自身を呼び出しているので、実際には2回実行される。最も少ない修正で期待した動作をさせるには、次の1行(set MSYS=MINGW32)を修正する事だ。
修正前のC:\MinGW64\msys\1.0\msys.bat

60 if "x%MSYSTEM%" == "x" set MSYSTEM=MINGW32

修正後のC:\MinGW64\msys\1.0\msys.bat

60 if "x%MSYSTEM%" == "x" set MSYSTEM=MINGW64
profileの修正

msys.batは、32bitか64bitで動いているかを判断しているだけで、実行パスには手を付けていない。実際にMSYSTEMを見て実行パスを決定しているのはprofileなので、これも修正する。
修正前のC:\MinGW64\msys\1.0\etc\profile

21  export PATH=".:/usr/local/bin:/bin:/c/mingw/bin:$PATH"

修正後のC:\MinGW64\msys\1.0\etc\profile

21  export PATH=".:/usr/local/bin:/bin:/c/mingw64/bin:$PATH"

64bitで生成されるか確認する

と、言うわけでMinGW(32bit)に引き続き、また日本語出力だ。ただ、前回と違うのは、タスクマネージャで*32が付くか、付かないかを確認するため、ENTERキーを押すまで、プログラムが終わらないようにしている。また、サンプルを作成する場所も、C:\MinGW64\msys\1.0\home\ユーザ名 とする。
サンプルプログラム a.c

#include <stdio.h>
#include <locale.h>

int
main(int argc, char** argv)
{
    setlocale(LC_ALL, "");
    printf("こんにちわったらこんにちわ\n");
    getchar();
    return 0;
}

これを、スタート→MinGW→MinGW64 Shellで起動したプロンプトの中でコンパイル/実行する。

gcc a.c
a.exe

タスクマネージャでa.exeに*32が付いておらず、ENTERキーを押した後に挙動不審にならなければ成功だ。
ちなみに、MinGW(32bit)に比べるとgccのバージョンが古いが、まぁ気にしない。問題があれば自分で作れば良いのだから。