ころころビルドオプションを変えるな!
久々にCygwinをアップデートしたのですが、TOPPERS/ASPカーネルのコンフィギュレータをビルドしようとすると、次のエラーが大量に出ました。
undefined reference to `__Unwind_SjLj_Unregister'
嫌な予感がしたので、GCCのビルドオプションを調べてみると、次のようになっていました。
$ g++ -v
Using built-in specs.
Target: i686-pc-cygwin
Configured with: /gnu/gcc/releases/packaging/4.3.4-3/gcc4-4.3.4-3/src/gcc-4.3.4/
configure --srcdir=/gnu/gcc/releases/packaging/4.3.4-3/gcc4-4.3.4-3/src/gcc-4.3.
4 --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --libex
ecdir=/usr/lib --datadir=/usr/share --localstatedir=/var --sysconfdir=/etc --inf
odir=/usr/share/info --mandir=/usr/share/man --datadir=/usr/share --infodir=/usr
/share/info --mandir=/usr/share/man -v --with-gmp=/usr --with-mpfr=/usr --enable
-bootstrap --enable-version-specific-runtime-libs --with-slibdir=/usr/bin --libe
xecdir=/usr/lib --enable-static --enable-shared --enable-shared-libgcc --disable
-__cxa_atexit --with-gnu-ld --with-gnu-as --with-dwarf2 --disable-sjlj-exception
s --enable-languages=ada,c,c++,fortran,java,objc,obj-c++ --disable-symvers --ena
ble-libjava --program-suffix=-4 --enable-libgomp --enable-libssp --enable-libada
--enable-threads=posix --with-arch=i686 --with-tune=generic --enable-libgcj-sub
libs CC=gcc-4 CXX=g++-4 CC_FOR_TARGET=gcc-4 CXX_FOR_TARGET=g++-4 GNATMAKE_FOR_TA
RGET=gnatmake GNATBIND_FOR_TARGET=gnatbind AS=/opt/gcc-tools/bin/as.exe AS_FOR_T
ARGET=/opt/gcc-tools/bin/as.exe LD=/opt/gcc-tools/bin/ld.exe LD_FOR_TARGET=/opt/
gcc-tools/bin/ld.exe --with-ecj-jar=/usr/share/java/ecj.jar
Thread model: posix
gcc version 4.3.4 20090804 (release) 1 (GCC)
Using built-in specs.
Target: i686-pc-cygwin
Configured with: /gnu/gcc/releases/packaging/4.3.4-3/gcc4-4.3.4-3/src/gcc-4.3.4/
configure --srcdir=/gnu/gcc/releases/packaging/4.3.4-3/gcc4-4.3.4-3/src/gcc-4.3.
4 --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --libex
ecdir=/usr/lib --datadir=/usr/share --localstatedir=/var --sysconfdir=/etc --inf
odir=/usr/share/info --mandir=/usr/share/man --datadir=/usr/share --infodir=/usr
/share/info --mandir=/usr/share/man -v --with-gmp=/usr --with-mpfr=/usr --enable
-bootstrap --enable-version-specific-runtime-libs --with-slibdir=/usr/bin --libe
xecdir=/usr/lib --enable-static --enable-shared --enable-shared-libgcc --disable
-__cxa_atexit --with-gnu-ld --with-gnu-as --with-dwarf2 --disable-sjlj-exception
s --enable-languages=ada,c,c++,fortran,java,objc,obj-c++ --disable-symvers --ena
ble-libjava --program-suffix=-4 --enable-libgomp --enable-libssp --enable-libada
--enable-threads=posix --with-arch=i686 --with-tune=generic --enable-libgcj-sub
libs CC=gcc-4 CXX=g++-4 CC_FOR_TARGET=gcc-4 CXX_FOR_TARGET=g++-4 GNATMAKE_FOR_TA
RGET=gnatmake GNATBIND_FOR_TARGET=gnatbind AS=/opt/gcc-tools/bin/as.exe AS_FOR_T
ARGET=/opt/gcc-tools/bin/as.exe LD=/opt/gcc-tools/bin/ld.exe LD_FOR_TARGET=/opt/
gcc-tools/bin/ld.exe --with-ecj-jar=/usr/share/java/ecj.jar
Thread model: posix
gcc version 4.3.4 20090804 (release) 1 (GCC)
案の定、--disable-sjlj-exceptionsオプションが指定されています。それに対して、CygwinのインストーラでインストールされるBoost C++ Librariesは、__Unwind_SjLj_Unregisterが未解決というエラーが出ていることからもわかるように、--enable-sjlj-exceptionsオプションを付けてビルドされたGCCでコンパイルされています。これではまともにリンクできるはずがありません。
そういえば、以前にも似たようなことがあった記憶があります。次回の更新で元に戻る可能性もあるので、急ぎでなければしばらく放置してもよいのですが、すぐ解決するにはBoost C++ Librariesを(自分で)ビルドしなおすしかなさそうです。まあ、Visual C++でビルドすることに比べれば、そう時間はかからないのが唯一の救いでしょうか。
この記事のトラックバックURL:
http://www.kijineko.co.jp/trackback/763
