調べたこと、作ったことをメモしています。
こちらに移行中: https://blog.shimazu.me/

openNI Sensor SensorKinectのraspberrypi向けクロスコンパイル

参考ページ

  1. Quadrotor - Cross compiling OpenNI for ARM - Robotics Club
  2. How to build a cross compiler for your Raspberry Pi | Chris's Digital Realm

1:クロスコンパイルのためのコンパイラを用意する

参考ページの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にすると通った。