[解決済み] Raspberry PiのクロスコンパイラをLinuxホストマシンにインストールする方法を教えてください。
質問
私は 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
関連
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み] スタックアロケーションにより初期化されていない値が作成された
-
[解決済み] Linuxで特定のテキストを含むすべてのファイルを検索するにはどうすればよいですか?
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] Linux上で動作するC++コードのプロファイリングを行うにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み】エラー:free(): 次のサイズが無効です(fast)。
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない