コミケ告知

サークル networkmaniacs.net(旧:浜風もっこす) 2017.02.17 デブサミ内 DevBooksに出展します。
詳細は circle タグの記事へ。
2013年2月6日水曜日

Raspberry Piでboostの使えるクロスコンパイル環境を構築

# はてなダイアリーから移動した記事です。あまり真面目に整形していません。

Raspberry Piはいいハードウェアですが、これの上でコード書いたりコンパイルしたりというのは大変です。入出力が弱いこともあって、C++のSTLやboostのヘッダをincludeすいると悲しいことになります。GNU screenの上に妙なプラグインがいくつも走るVimをたくさん開く開発スタイルもきつそう。

distcc(分散コンパイル環境)を走らせれば…と一瞬思いましたが、Raspberry Pi上のリソースを使う意味が皆無なので、まっとうなPCの上でクロスコンパイルすることにしました。

試した環境

Windows上で走っているVirtualBox内の、64bitのDebianです。

Linux version 2.6.32-5-amd64 (Debian 2.6.32-46) (dannf@debian.org) (gcc version 4.3.5 (Debian 4.3.5-4) ) #1 SMP Sun Sep 23 10:07:46 UTC 2012

クロスコンパイル環境の構築

参考記事:How to build a cross compiler for your Raspberry Pi | Chris's Digital Realm
多少のバージョン番号の違いはあれど、上記記事の箇条書きに従って進めれば、あっさりとクロスコンパイル環境が出来ました。

微妙にはまったところは…

  • ディスク容量は4GBでは足りなかった
    • 仮想マシン等でディスク容量が限られる場合や、RAMディスク上で済ませようとする場合は注意
  • C++を使いたい場合は、参考記事の手順では足りない
    • コメントにある通り、C-compiler → Additional supported languages and enable C++を有効にする
  • rootユーザーで作業しないこと

rootユーザーについては、ct-ng menuconfig内に警告文があります。以下引用。

You normally do *not* need to be root to build a toolchain using crosstool-NG.
In fact, it is *VERY* dangerous to run as root, as crosstool-NG will, as part of the build process, remove a few directories.
If anything goes wrong, running as root can ruin your host distribution.

変な設定してrootで走らせると、OSごとまともに動かなくなる可能性もあるよ!という警告。警告文があるだけでなくて、何か所かそれっぽい設定にチェックを入れないと実行も出来ません。

全てが無事終わると、/opt/cross/x-tools/arm-unknown-linux-gnueabi/bin 以下に、arm-unknown-linux-gnueabi-xxx といった名前のものがごろごろしているので、これらを用いればあっさりとクロスコンパイルが出来ます。

% arm-unknown-linux-gnueabi-gcc main.c
% file a.out a.out: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 3.7.3, not stripped

boostの準備

ヘッダだけで済むものは何の苦労もないですが、ライブラリをリンクする必要のあるものはboostをビルドする必要があります。たぶん。
めんどいので完成品をいただきました。
Raspberry Pi • View topic - Boost C++ libraries for Raspberry Pi

適当なコードを書いて…

#include <stdio.h>
#include <unistd.h>
#include <boost/thread.hpp>

int main(int argc, char **argv) {
  bool enabled = true;
  boost::thread th1([&enabled](){
    while (enabled) {
      printf("hoge!\n");
      sleep(1);
    }
  });
  getchar();
  enabled = false;
  return 0;
}

適当に必要なパス情報を与えてコンパイル。-Lのパスは必要なもの(*.so)を置いた場所によりけり。この場所に置くのが妥当がどうかは知らないけども…

% arm-unknown-linux-gnueabi-g++ -std=c++11 bthread.cpp -I/usr/include -L/opt/cross/x-tools/arm-unknown-linux-gnueabi/lib -lboost_thread

scpでRaspberry Pi上に送って実行。Raspberry Piの環境には、apt-getでboostのライブラリを導入してあります。
raspberrypi ~% ./a.out
hoge!
hoge!
hoge!

動いた。本日ここまで。

0 件のコメント:

コメントを投稿