Ubuntu8.04にOpenNIインストールできず。。

故あってUbuntu8.04でKinectを使いたくなり、インストールを試みましたが数時間格闘の末に負けた顛末を書き留めておきます。
年末に何やってんだか。。。
基本的にTKさんの記事を参考に環境を構築しようとしました。

libusbインストール

Ubuntu10.10のときはlibusb-1.0-0とlibusb-1.0-0-devをパッケージマネージャでインストールできたので楽勝だったのですが、
Ubuntu8.04ではできないのでソースからMakeしてインストールします。

$ git clone http://git.libusb.org/libusb.git
$ cd libusb
$ ./autogen.sh|

「バージョンの違いとか大丈夫?」とか思いながら先に進む。

OpenNIインストール

こちらもgitで取得したソースをMakeする。

../../../../Source/OpenNI/Linux-x86/XnUSBLinux-x86.cpp: In function ‘XnStatus xnUSBOpenEndPoint(XnUSBDeviceHandle*, XnUInt16, XnUSBEndPointType, XnUSBDirectionType, XnUSBEndPointHandle**)’:
../../../../Source/OpenNI/Linux-x86/XnUSBLinux-x86.cpp:500: error: ‘libusb_get_max_iso_packet_size’ was not declared in this scope
make[1]: *** [Release/XnUSBLinux-x86.o] エラー 1

libusbの関数がないと仰る(案の定)。/usr/local/include/libusb.hにlibusb_get_max_iso_packet_size()という関数がないらしい。ないものはどうしようもない!
libusb_get_max_packet_size()という関数はあるらしい。よし、ソースコード変えちゃえ。

//if (transfer_type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS)
//{
// pHandle->nMaxPacketSize = libusb_get_max_iso_packet_size(pDevice, nEndPointID);
//}
//else
//{
// pHandle->nMaxPacketSize = libusb_get_max_packet_size(pDevice, nEndPointID);
//}
pHandle->nMaxPacketSize = libusb_get_max_packet_size(pDevice, nEndPointID);

そしてコンパイルを通すぅ。後で動かなかったら仕方がない。

Sensorインストール

これはスムーズ。

Niteインストール

$ cd Nite-1.3.0.17/
$ sudo ./install.bash
..
..
g++ -malign-double -DNDEBUG -msse3 -mssse3 -I../Players -I/usr/include/nite -I/usr/include/ni -DUSE_GLUT -DXN_SSE -M -MF Release/main.d -MT "./Release/main.o Release/main.d" ../Players/main.cpp
cc1plus: error: unrecognized command line option "-mssse3"
g++ -c -malign-double -DNDEBUG -msse3 -mssse3 -I../Players -I/usr/include/nite -I/usr/include/ni -DUSE_GLUT -DXN_SSE -o Release/main.o ../Players/main.cpp
cc1plus: error: unrecognized command line option "-mssse3"
make[1]: *** [Release/main.o] エラー 1
make[1]: ディレクトリ `/home/user/src/kinect/Nite-1.3.0.17/Samples/Players' から出ます
make: *** [all] エラー 2

んんー? SSE3命令が認識できない?しゃらくさいのでこれもMakefileかえちゃう。SSE3関連をコメントアウト

# set Debug / Release flags
ifeq "$(CFG)" "Debug"
CFLAGS += -g
ifeq ($(SSE_GENERATION), 2)
CFLAGS += -msse2
else
# ifeq ($(SSE_GENERATION), 3)
# CFLAGS += -msse3 -mssse3 -mpc80
# else
# ($error "Only SSE2 and SSE3 are supported")
# endif
endif
endif
ifeq "$(CFG)" "Release"
CFLAGS += -O2 -fno-tree-pre -fno-strict-aliasing
# CFLAGS += -O3 -fno-tree-pre -fno-strict-aliasing
CFLAGS += -DNDEBUG

ifeq ($(SSE_GENERATION), 2)
CFLAGS += -msse2
else
# ifeq ($(SSE_GENERATION), 3)
# CFLAGS += -msse3 -mssse3
# else
# ($error "Only SSE2 and SSE3 are supported")
# endif
endif
endif

で、もう一度やると、おっ通った、かと思いきや..

g++ -o ../Bin/Sample-Players ./Release/main.o ./Release/SceneDrawer.o ./Release/kbhit.o ./Release/signal_catch.o -L../Bin -lglut -lOpenNI -lXnVNite
/usr/lib/gcc/i486-linux-gnu/4.2.4/../../../../lib/libXnVNite.so: undefined reference to `std::ctype::_M_widen_init() const@GLIBCXX_3.4.11'
collect2: ld はステータス 1 で終了しました
make[1]: *** [../Bin/Sample-Players] エラー 1

んんー? C標準ライブラリでリンクエラー? 嫌な予感。
そもそもNITEはオープンソースではないので、インストールと言ってもsoを/usr/local/lib/とかに移してサンプルをコンパイルするくらいのはずで、コンパイルエラーなんてあるはずがない。
でも、libXnVNite.soがstd::ctypeの関数へリンクできないと仰る。ググってみたけど有効な手がかりはなく、どうやらlibXnVNite.soをビルドした環境とUbutu8.04のg++のバージョンが合っていない模様。
もちろんapt-get updateしてるからUbuntu8.04のコンパイル環境がダメということになる。
ldd libXnVNite.so で調べてみるとlibstdc++.so.6にリンクしている。これっぽい。g++とgccのバージョンは同じ4.4。
手元のUbuntu10.10のlibstdc++は6.0.14。Ubuntu8.04のlibstdc++は6.0.9。微妙に違う。

まとめ

本当にここらへんに原因があるのかわかりませんが、この方向で深入りするとロクなことがないので悔しいけど諦めます。
誰か出来た人いたら教えてください〜(泣)。