2010年7月16日金曜日

Eclipse CDT と MinGW(64bit版)でコンパイル

Eclipse CDT と MinGW(64bit版)でコンパイルをしてみたくなったので、やってみた。

■確認した環境

AMD Phenom(tm) II X4 955 3.20GHz
Windows Vista Business SP2 64bit

JDK 1.6.0_16  64bit
MinGW(64bit版)(mingw-w64-bin_i686-mingw_20100702_sezero.zip)
Eclipse Classic 3.6.0 64bit(eclipse-SDK-3.6-win32-x86_64.zip)
C/C++ Development Tools 7.0.0.201006141710

  • 間違いの元その1:MinGW は、元から 32bit 版が入っていて(C:\MinGW)、後から 64bit 版を入れた(C:\MinGW64)
    CDT は C:\MinGW にMinGW がインストールされていると、Path に設定されいるかは、関係なく、このディレクトリの GCC を使用してしまう。よって、32bit 版を、C:\MinGW86 にリネームした。
  • 間違いの元その2:環境変数の Path に、MinGW のパスを設定していない。
    CDT は、C:\MinGW にMingGW がインストールされていない場合は、環境変数の Path に設定された、パスから GCC を探して利用する。よって、Windows の「システムプロパティ」-「環境変数」で”Path”に”C:\MinGW64\bin”を追加した。
    GCC のパスは、Eclipse の設定で「C/C++」-「Build」-「Environment」などに設定しても、だめだった。


■作業経過

Eclipse を起動
任意のワークスペースを指定する
「Window」メニューから「Preferences」で設定ダイアログを開く

「C/C++」-「New CDT Project Wizard」-「Makefile Project」を選択
「Binary Parsers」タブで”PE Windows Parser”チェックボックスをチェック
「OK」ボタンを押す

「File」メニューから「New」-「C++ Project」を選択
「Project name」に”Hello”を入力
「Project type:」から「Makefile project」-「Hello World C++ Project」を選択

ここで、運命の分かれ道、C:\MinGW ディレクトリに、MinGW をインストールしてあるか、または環境変数”Path”に”C:\MinGW64\bin”が設定されていると、「Toolchains:」に”MinGW GCC”が表示される。そうでない場合は、”-- Other Toolchain --”だけが表示される。

「Toolchains:」で”MinGW GCC”を選択し、「Finish」を押す
「Project」メニューから「Build All」を選択

”Internal Builder: Cannot run program "g++"”などど怒られ、ビルドが失敗する場合、環境変数 Path に MinGW の bin ディレクトリが設定されているかどうか確認する。環境変数を変更した場合、Eclipse を再起動する必要がある。

C:\MinGW があり、環境変数の Path に C:\MinGW64\bin が設定されていたとすると、”g++: CreateProcess: No such file or directory”のようなエラーとなる。
g++ に -v オプションをつけてコンパイルしてみると、”cc1plus -quiet -v -iprefix c:\mingw\bin\../lib/gcc/x86_64-w64-mingw32/4.4.5/ -isysroot c:\mingw\bin\../../mingw64 -dD ..”のような、意図しないパスを見ていることがわかる。

コンパイルが、成功したら、Hello プロジェクトの Debug ディレクトリに Hello.exe ができている。
この実行ファイルを、コマンドラインから実行してみる。

”libgcc_s_sjlj-1.dll が見つからなかったため、このアプリケーションを開始できませんでした。アプリケーションをインストールし直すとこの問題は解決される場合があります。”

と怒られる。
この場合、DLL を使わないようにリンクオプションを追加する必要がある。手順は以下の通り。

Eclipse の Hello プロジェクトを右クリックして、「Properties」を選択
設定ダイアログで、「C/C++ Build」-「Settings」を選択
「Tool Settings」タブで「MinGW C++ Linker」-「Miscellaneous」を選択
「Linker flags」に”-static”を追加
「OK」ボタンを押す

Hello プロジェクトを右クリックして、「Clean Project」を選択(Close Project じゃないよ)
リビルドされた Hello.exe を再び、コマンドラインから実行
”!!!Hello World!!!”と表示されれば成功!

ちなみに、環境変数 Path に設定するパスを MinGW 32bit 版と 64bit 版を入れ替えて、Eclipse を再起動すると、x86 用または x64 用の実行ファイルがコンパイルできる。