1. ホーム
  2. c++

[解決済み] Raspberry PiのクロスコンパイラをLinuxホストマシンにインストールする方法を教えてください。

2022-08-14 05:04:08

質問

私は Ubuntu マシンで Raspberry Pi 用のクロスコンパイルを動作させようとしています。

私の最初の試みの間、私は、Ubuntu レポで利用可能な arm-linux-gnueabi コンパイラーを使用していました。私はこれを動作させました。私は、すべての依存関係を構築し、私の cmake プロジェクトでクロス コンパイラーを使用することができました。

しかし、私は hf バージョンを使用すべきであると考えているので、arm-linux-gnueabihf に切り替えました。そして、Raspberry Pi が armv6 なので、これは動作しないことに気づきました。

いろいろググってみると GitHub からビルド済みのツールチェイン .

ツールチェインをダウンロードしたのですが、インストール方法がよくわかりません。私はファイルをホーム ディレクトリに解凍しました。ディレクトリ構造はこのようになっています。

/gcc-linearo-arm-linux-gnueabihf-raspbian
    /arm-linux-gnueabihf
        /bin
            (contains g++, gcc, etc)
        /lib
            (contains libstdc++ library)
    /bin
        (contains arm-linux-gnueabihf-g++, arm-linux-gnueabihf-...)
    /lib
        (gcc lib stuff)

INNER bin フォルダにディレクトリを変更すると、ターミナルから問題なくテストプログラムをコンパイルすることができます。

~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/
arm-linux-gnueabihf/bin$ g++ test.cpp -o test

次に、ツールのプレフィックス版を含むOUTER binフォルダーでテストプログラムをコンパイルしてみました。

 ~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin$ 
 arm-linux-gnueabihf-g++ test.cpp -o test

しかし、今コンパイラを使おうとすると (内部のbinディレクトリの外から)、ツールチェーンに付属しているlibstdc++共有ライブラリを見つけることができません。

arm-linux-gnueabihf-gcc: error while loading shared libraries: 
libstdc++.so.6: cannot open shared object file: No such file or directory.

さらに、私はbinディレクトリに移動することなく、コンパイラを使用できるようにしたいです。そこで、OUTER bin ディレクトリ (プレフィックス付きバージョンが欲しいので) と両方の lib ディレクトリを私の PATH に追加しようとしました。

export PATH=$PATH:~/tools/.../bin
export PATH=$PATH:~/tools/.../lib
export PATH=$PATH:~/tools/.../.../lib

しかし、これは同じエラーになります。Ubuntu レポからクロス コンパイラーを使用するときのように、どこからでもツール チェーンを使用できるようにするには、どのように "install" すればよいのでしょうか。

どのように解決するのですか。

チュートリアルのつもりで書いてみますので、わかりやすいと思います。

注意。 このチュートリアルは古い Raspbian イメージに対してのみ機能します。Debian Buster ベースの新しい Raspbian については、このスレッドにある以下のハウツーを参照してください。 https://stackoverflow.com/a/58559140/869402

事前要件

開始する前に、以下のものがインストールされていることを確認する必要があります。

apt-get install git rsync cmake libc6-i386 lib32z1 lib32stdc++6

Pieをクロスコンパイルしてみよう!

まず、ホームディレクトリに raspberrypi .

このフォルダに入り、先ほどのツールフォルダをすべて引き出します。

git clone git://github.com/raspberrypi/tools.git

3つのうち、下記を使いたかったんですね。 gcc-linaro-arm-linux-gnueabihf-raspbian を使いたかったのですね。

ホームディレクトリに入り、追加します。

export PATH=$PATH:$HOME/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin

というファイルの末尾に ~/.bashrc

これで、ログアウトしてログインし直す (つまり端末セッションを再起動する) か、あるいは . ~/.bashrc をターミナルで実行して PATH を追加してください。

ここで、コンパイラにアクセスできることを確認します。 arm-linux-gnueabihf-gcc -v . このようなものが得られるはずです。

Using built-in specs.
COLLECT_GCC=arm-linux-gnueabihf-gcc
COLLECT_LTO_WRAPPER=/home/tudhalyas/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/../libexec/gcc/arm-linux-gnueabihf/4.7.2/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: /cbuild/slaves/oort61/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/.b
 uild/src/gcc-linaro-4.7-2012.08/configure --build=i686-build_pc-linux-gnu --host=i686-build_pc-
 linux-gnu --target=arm-linux-gnueabihf --prefix=/cbuild/slaves/oort61/crosstool-ng/builds/arm-l
 inux-gnueabihf-raspbian-linux/install --with-sysroot=/cbuild/slaves/oort61/crosstool-ng/builds/
 arm-linux-gnueabihf-raspbian-linux/install/arm-linux-gnueabihf/libc --enable-languages=c,c++,fo
 rtran --disable-multilib --with-arch=armv6 --with-tune=arm1176jz-s --with-fpu=vfp --with-float=
 hard --with-pkgversion='crosstool-NG linaro-1.13.1+bzr2458 - Linaro GCC 2012.08' --with-bugurl=
 https://bugs.launchpad.net/gcc-linaro --enable-__cxa_atexit --enable-libmudflap --enable-libgom
 p --enable-libssp --with-gmp=/cbuild/slaves/oort61/crosstool-ng/builds/arm-linux-gnueabihf-rasp
 bian-linux/.build/arm-linux-gnueabihf/build/static --with-mpfr=/cbuild/slaves/oort61/crosstool-
 ng/builds/arm-linux-gnueabihf-raspbian-linux/.build/arm-linux-gnueabihf/build/static --with-mpc
 =/cbuild/slaves/oort61/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/.build/arm-linux-
 gnueabihf/build/static --with-ppl=/cbuild/slaves/oort61/crosstool-ng/builds/arm-linux-gnueabihf
 -raspbian-linux/.build/arm-linux-gnueabihf/build/static --with-cloog=/cbuild/slaves/oort61/cros
 stool-ng/builds/arm-linux-gnueabihf-raspbian-linux/.build/arm-linux-gnueabihf/build/static --wi
 th-libelf=/cbuild/slaves/oort61/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/.build/a
 rm-linux-gnueabihf/build/static --with-host-libstdcxx='-L/cbuild/slaves/oort61/crosstool-ng/bui
 lds/arm-linux-gnueabihf-raspbian-linux/.build/arm-linux-gnueabihf/build/static/lib -lpwl' --ena
 ble-threads=posix --disable-libstdcxx-pch --enable-linker-build-id --enable-plugin --enable-gol
 d --with-local-prefix=/cbuild/slaves/oort61/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-li
 nux/install/arm-linux-gnueabihf/libc --enable-c99 --enable-long-long
Thread model: posix
gcc version 4.7.2 20120731 (prerelease) (crosstool-NG linaro-1.13.1+bzr2458 - Linaro GCC 2012.08
 )

しかし、ちょっと! そうしたら、まだライブラリが動かないんです!

まだ終わってませんよ! 今のところ、基本的なことしかしていません。

あなたの raspberrypi というフォルダを作成し rootfs .

ここで /lib/usr ディレクトリを、この新しく作成したフォルダにコピーします。私は通常、rpi イメージを持ち出して、rsync でコピーしています。

rsync -rl --delete-after --safe-links [email protected]:/{lib,usr} $HOME/raspberrypi/rootfs

ここで 192.168.1.PI の部分は、Raspberry PiのIPに置き換えてください。

さて、次に cmake の設定ファイルを作成します。開く ~/home/raspberrypi/pi.cmake をお好みのエディタで開き、以下を挿入してください。

SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_VERSION 1)
SET(CMAKE_C_COMPILER $ENV{HOME}/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-gcc)
SET(CMAKE_CXX_COMPILER $ENV{HOME}/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-g++)
SET(CMAKE_FIND_ROOT_PATH $ENV{HOME}/raspberrypi/rootfs)
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

これで cmake プログラムをコンパイルできるようになりました。 -D CMAKE_TOOLCHAIN_FILE=$HOME/raspberrypi/pi.cmake .

を使うことで cmake hello world の例です。

git clone https://github.com/jameskbride/cmake-hello-world.git 
cd cmake-hello-world
mkdir build
cd build
cmake -D CMAKE_TOOLCHAIN_FILE=$HOME/raspberrypi/pi.cmake ../
make
scp CMakeHelloWorld [email protected]:/home/pi/
ssh [email protected] ./CMakeHelloWorld