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 が見つかりました。


トラックバックURL

コメントする

名前
 
  絵文字
 
 
記事検索
最新コメント
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

QRコード
QRコード