openNI Sensor SensorKinectのraspberrypi向けクロスコンパイル
参考ページ
- Quadrotor - Cross compiling OpenNI for ARM - Robotics Club
- How to build a cross compiler for your Raspberry Pi | Chris's Digital Realm
参考ページの2番の通り。
追加!
このとき、なぜか絶対パスで指定されているものを直す必要があるっぽい・・・?? #要確認
なぜ元々こうなっているのかわからないけど、これをしないとコンパイルは通らない。
参考ページ:Linker “ld: cannot find /lib/libpthread.so.0″ « 0xC0FFEE
具体的には、/opt/cross/x-tools/arm-unknown-linux-gnueabi/arm-unknown-linux-gnueabi/sysroot/usr/libにある2つのファイルを以下のように書き換える。
libpthread.so
GROUP ( /lib/libpthread.so.0 /usr/lib/libpthread_nonshared.a )
これを以下のように変更
GROUP ( libpthread.so.0 libpthread_nonshared.a )
libc.so
GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a AS_NEEDED ( /lib/ld-linux-armhf.so.3 ) )
これを以下のように変更
GROUP ( libc.so.6 libc_nonshared.a AS_NEEDED ( ld-linux-armhf.so.3 ) )
2:gitで適当なディレクトリに引っ張ってくる
$ mkdir -p ~/tmp/RpiKinect/
$ cd ~/tmp/RpiKinect
$ git clone https://github.com/OpenNI/OpenNI
$ git clone https://github.com/PrimeSense/Sensor
$ git clone https://github.com/avin2/SensorKinect
3:OpenNIのバージョンを合わせておく
$ cd OpenNI
$ git checkout -b 1.5.2.23 refs/tags/Stable-1.5.2.23
3:CFLAGSの変更
OpenNI/Platform/Linux/Build/Common/Platform.Arm
Sensor/Platform/Linux/Build/Common/Platform.Arm
SensorKinect/Platform/Linux/Build/Common/Platform.Arm
の3つのファイルのCFLAGSを以下のように変更する
# Hardware specifying flags
CFLAGS += -mtune=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard
#CFLAGS += -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp #-mcpu=cortex-a8
4:Stagingというディレクトリを用意し、必要なファイルをリンク張る
Stagingがsysrootとなるようにするので、それに合わせる。
$ mkdir Staging
$ cd Staging
$ ln -s /opt/cross/x-tools/arm-unknown-linux-gnueabi/arm-unknown-linux-gnueabi/sysroot/sbin .
$ ln -s /opt/cross/x-tools/arm-unknown-linux-gnueabi/arm-unknown-linux-gnueabi/sysroot/include .
$ ln -s /opt/cross/x-tools/arm-unknown-linux-gnueabi/arm-unknown-linux-gnueabi/sysroot/lib .
$ ln -s lib lib32
$ ln -s lib lib64
$ mkdir usr
$ cd usr
$ ln -s /opt/cross/x-tools/arm-unknown-linux-gnueabi/arm-unknown-linux-gnueabi/sysroot/usr/lib .
$ ln -s /opt/cross/x-tools/arm-unknown-linux-gnueabi/arm-unknown-linux-gnueabi/sysroot/usr/include .
$ cd ../../
5: 以下のようなシェルスクリプトcompile.shをopenNI等が保存されているのと同じディレクトリに用意し、実行する
SCRIPT_DIR=`pwd`
export ARM_CXX=arm-unknown-linux-gnueabi-g++
export ARM_STAGING=$SCRIPT_DIR/Staging
mkdir -p $ARM_STAGING/usr/lib
mkdir -p $ARM_STAGING/usr/bin
mkdir -p $ARM_STAGING/usr/etc/primesense
mkdir -p $ARM_STAGING/etc/udev/rules.d
mkdir -p $ARM_STAGING/var/log/primesense
mkdir -p Final
# build OpenNI
cd OpenNI/Platform/Linux/CreateRedist
chmod +x RedistMaker
./RedistMaker Arm
cp Final/* $SCRIPT_DIR/Final
# install libs for Sensor and SensorKinect to use
cd ../Redist/OpenNI-Bin-Dev-Linux-Arm-v1.5.2.23
chmod +x install.sh
./install.sh -c $ARM_STAGING
# build Sensor
cd $SCRIPT_DIR/Sensor/Platform/Linux/CreateRedist
chmod +x RedistMaker
./RedistMaker Arm
cp Final/* $SCRIPT_DIR/Final
# build SensorKinect
cd $SCRIPT_DIR/SensorKinect/Platform/Linux/CreateRedist
chmod +x RedistMaker
./RedistMaker Arm
cp Final/* $SCRIPT_DIR/Final
$ chmod +x compile.sh
$ ./compile.sh
するとなぜか以下のようなエラーが出て止まる。 →解決! 1番のようにlibpthread.soとlibc.soを修正する必要があるようである。
/opt/cross/x-tools/arm-unknown-linux-gnueabi/lib/gcc/arm-unknown-linux-gnueabi/4.6.4/../../../../arm-unknown-linux-gnueabi/bin/ld: cannot find /lib/libpthread.so.0
/opt/cross/x-tools/arm-unknown-linux-gnueabi/lib/gcc/arm-unknown-linux-gnueabi/4.6.4/../../../../arm-unknown-linux-gnueabi/bin/ld: cannot find /usr/lib/libpthread_nonshared.a
collect2: ld returned 1 exit status
だが、
2: error: 'void XnServerSensorInvoker::_XnServerStreamsHash::operator=(const XnServerSensorInvoker::_XnServerStreamsHash&)' is private
とかいうエラーでSensorKinectのコンパイルが通らない。うへ。
調べてもなんもでないし困ったので、他のbranchを見ることにした。
するとunstableということだったのでmasterをcheckoutしたが、それでもダメ。
tags/v0.93-5.1.2.1をつかったらコンパイルが通ったみたいです。
が、Sensorはやっぱりコンパイルが通っていない。
これは、OpenNIのバージョンをStable-1.5.2.23にすると通った。