新しい Raspbian Debian Buster イメージと ARMv6 用のビルド
@Stenyg による回答は、古い Raspbian イメージに対してのみ機能します。最近リリースされた Debian Buster ベースの Raspbian には、更新されたツールチェーンが必要です:
Debian Buster では、gcc コンパイラと glibc がバージョン 8.3 に更新されました。 git://github.com/raspberrypi/tools.git
のツールチェーン まだ古い gcc 6 バージョンに基づいています。これは、 git://github.com/raspberrypi/tools.git
を使用することを意味します 多くのコンパイル エラーが発生します。
このチュートリアルは、@Stenyg の回答に基づいています。インターネットの他の多くのソリューションに加えて、このチュートリアルでは古い Rasperry Pi (A、B、B+、Zero) もサポートしています。 ) ARMv6 CPU に基づいています。参照:GCC 8 クロス コンパイラは ARMv6 ではなく ARMv7 実行可能ファイルを出力します
ツールチェーンをセットアップする
更新されたツールチェーンを含む公式の git リポジトリはありません (https://github.com/raspberrypi/tools/issues/102 を参照してください)。
GCC8 以降に基づく ARMv6 用のビルドおよびプリコンパイル済みツールチェーンを含む新しい github リポジトリを作成しました:
https://github.com/Pro/raspi-toolchain
プロジェクトの readme に記載されているように、ツールチェーンを入手する手順は次のとおりです。自分でビルドすることもできます (詳細については、README を参照してください)。
<オール>wget https://github.com/Pro/raspi-toolchain/releases/latest/download/raspi-toolchain.tar.gz
- 抽出します。注:ツールチェーンは
/opt/cross-pi-gcc
である必要があります 場所に依存しないためです。
sudo tar xfz raspi-toolchain.tar.gz --strip-components=1 -C /opt
-
これで完了です。ツールチェーンは現在
/opt/cross-pi-gcc
にあります -
オプションで、以下を追加してツールチェーンをパスに追加します。
export PATH=$PATH:/opt/cross-pi-gcc/bin
~/.bashrc
という名前のファイルの最後まで
これで、ログアウトして再度ログインする (つまり、ターミナル セッションを再起動する) か、. ~/.bashrc
を実行できます。 ターミナルで PATH
を取得します 現在の端末セッションに追加します。
Raspberry PI からライブラリを取得する
カスタム ライブラリがインストールされている可能性がある独自の Raspberry Pi 用にクロスコンパイルするには、これらのライブラリをホストにインストールする必要があります。
フォルダ $HOME/raspberrypi
を作成します .あなたの raspberrypi
で rootfs
という名前のフォルダーを作成します。 .
/lib
全体をコピーする必要があります。 と /usr
ディレクトリをこの新しく作成されたフォルダーに移動します。私は通常、rpi イメージを立ち上げ、rsync 経由でコピーします:
rsync -vR --progress -rl --delete-after --safe-links [email protected]:/{lib,usr,opt/vc/lib} $HOME/raspberrypi/rootfs
どこで 192.168.1.PI
Raspberry Pi の IP に置き換えられます。
CMake を使用してプロジェクトをコンパイルする
独自のツールチェーンを使用するように CMake に指示するには、コンパイラ設定を初期化するツールチェーン ファイルが必要です。
このツールチェーン ファイルはこちらから入手してください:https://github.com/Pro/raspi-toolchain/blob/master/Toolchain-rpi.cmake
これで cmake
をコンパイルできるはずです この追加フラグを追加するだけでプログラムを作成できます:-D CMAKE_TOOLCHAIN_FILE=$HOME/raspberrypi/pi.cmake
正しい環境変数を設定します:
export RASPBIAN_ROOTFS=$HOME/raspberry/rootfs
export PATH=/opt/cross-pi-gcc/bin:$PATH
export RASPBERRY_VERSION=1
cmake -DCMAKE_TOOLCHAIN_FILE=$HOME/raspberry/Toolchain-rpi.cmake ..
Hello World の例を次に示します:https://github.com/Pro/raspi-toolchain/blob/master/build_hello_world.sh
簡単に理解できるように、これをチュートリアルとして書こうと思います。
注:このチュートリアルは、古い 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