2010年04月16日
MinGW GCC 4.5 を試してみる。
まだ has been released とは書いてないので微妙ですが、一応 GCC 4.5 が Current release series になり、各ミラーサイトに tar ball も上がっているようです。
4.5 の目玉の一つ LTO は、まだ Windows (PE-COFF target) では動かないようですが、patch が投げられているので、おそらく 4.5.1 あたりに入るのではないでしょうか。
[PATCH,4.6/4.5.1,PR42776] Implement LTO for Windows (PE-COFF) targets.
4.5 は他にも Plugin など、面白そうな機能がたくさん入っています。さっそくビルド… といきたいところですが、GMP/MPFR の他に、MPC/PPL/CLooG-PPL とさらに依存ライブラリが増えているので、ちょっと大変そうです。
とりあえずバイナリをダウンロードして試してみましょう。
MinGW のサイトの Manual Installation of GCC 4.5を参考にし、以下のファイルをダウンロードします。
C:\MinGW\gcc-4.5>ls *.tar.lzma gcc-c++-4.5.0_20100311-2-mingw32-bin.tar.lzma gcc-core-4.5.0_20100311-2-mingw32-bin.tar.lzma gmp-5.0.1-1-mingw32-dev.tar.lzma libgcc-4.5.0_20100311-2-mingw32-dll-1.tar.lzma libgmp-5.0.1-1-mingw32-dll-10.tar.lzma libgomp-4.5.0_20100311-2-mingw32-dll-1.tar.lzma libmpc-0.8.1-1-mingw32-dll-2.tar.lzma libmpfr-2.4.1-1-mingw32-dll-1.tar.lzma libpthread-2.8.0-3-mingw32-dll-2.tar.lzma libssp-4.5.0_20100311-2-mingw32-dll-0.tar.lzma libstdc++-4.5.0_20100311-2-mingw32-dll-6.tar.lzma mpc-0.8.1-1-mingw32-dev.tar.lzma mpfr-2.4.1-1-mingw32-dev.tar.lzma pthreads-w32-2.8.0-3-mingw32-dev.tar.lzma
現在の MinGW プロジェクトは tar.lzma 形式でバイナリを配布しているので、MSYS の lzma コマンド (1.0.11 以降に入っています) か、7-Zip などのツールが必要です。私は 7-Zip でまとめて展開しました。全て展開後は、bin/lib/share/include/libexec の 5 つのディレクトリができます。
とりあえず、g++ で C++0x の新機能を試してみます。
さきほど展開した bin と、MinGW の bin に PATH を通します。(binutils やランタイムはそのまま元の MinGW のものを使います。)
C:\test>path %path%;c:\MinGW\gcc-4.5\bin;c:\MinGW\bin
C:\test>g++ -v Using built-in specs. COLLECT_GCC=g++ COLLECT_LTO_WRAPPER=c:/mingw/gcc-4.5/bin/../libexec/gcc/mingw32/4.5.0/lto-wrapper.exe Target: mingw32 コンフィグオプション: ../gcc-4.5.0_20100311/configure --enable-languages=c,c++,ada,fortran,objc,obj-c++ --disable-sjlj-exceptions --with-dwarf2 --enable-shared --enable-libgomp --disable-win32-registry --enable-libstdcxx-debug --enable-version-specific-runtime-libs --disable-werror --build=mingw32 --prefix=/mingw スレッドモデル: win32 gcc version 4.5.0 20100311 (experimental) (GCC)
例題は、「C++0x lambda」で検索して一番上にきた、このサイトのものを使わせていただきます。
C:\test>cat lambda.cpp /* * n で割り切れる要素を探す */ #include <algorithm> #include <iostream> int main() { int ar[] = { 9, 7, 5, 3, 1, -2, -4, -6, -8, 0 }; int n = 4; int* found = std::find_if(ar, ar+10, // ↓これがラムダ式 [n](int x) { return x % n == 0;} ); if ( found != ar+10 ) { std::cout << n << " で割り切れる数 " << *found << " が見つかりました。" << std::endl; } }
おっと、当然 C++0x はデフォルトではありません。
C:\test>g++ lambda.cpp lambda.cpp: In function 'int main()': lambda.cpp:10:38: 警告: lambda expressions only available with -std=c++0x or -std=gnu++0x lambda.cpp:12:62: error: no matching function for call to 'find_if(int [10], int*, main()::<lambda(int)>)'
今度はリンクでエラーになりました。
C:\test>g++ -std=c++0x lambda.cpp Info: resolving std::cout by linking to __imp___ZSt4cout (auto-import) c:\MinGW\bin/ld.exe: warning: auto-importing has been activated without --enable -auto-import specified on the command line. This should work unless it involves constant data structures referencing symbols from auto-imported DLLs.
特にリンカが古いというわけでも無さそう。
C:\test>ld -v GNU ld (GNU Binutils) 2.20
リンカに --enable-auto-import オプションを渡してみます。
C:\test>g++ -std=c++0x -Wl,--enable-auto-import lambda.cpp -o lambda
無事にコンパイルと実行ができました。
C:\test>lambda.exe 4 で割り切れる数 -4 が見つかりました。