概要
Debain上でコンパイルしたC言語のプログラムをRaspberry Pi Zeroで動かします。
共有ライブラリとか使える環境にしたいです。
とりあえず、libusb
とかlibjpeg
とか使えるようにします。
Ubuntu上でRaspberry Pi Zero向けクロスコンパイル事始め の続きですが、ホストマシンをDebianにして再挑戦しています(理由は後ほど)。
環境
ホスト: Debian 10.6.0 < Virtual Box 6.1 < WIndows10
ターゲット: Raspberry Pi Zero WH
手順
ARM向けコンパイラのインストール
$ sudo apt install crossbuild-essential-armel
前回はg++-arm-linux-gnueabi
をインストールしてみましたが、crossbuild-essential-armel
に含まれているようなのでこちらをインストールしてみます。結局使うのはgccなんであんまり大差ないですけど。
共有ライブラリのインストール
アーキテクチャを追加して、、
$ sudo dpkg --add-architecture armel
sources.list
の編集。apt
が参照するリポジトリを追加してやります。
$ sudo nano /etc/apt/sources.list
sources.list
の一番下に以下を追加。
armelの場合はftp.jp.debian.orgも参照するようにします。
deb [arch=armel] http://ftp.jp.debian.org/debian buster main
アップデートして、ライブラリをインストール。
:armel
を付与することでarmel
向けのライブラリを取得することができます。
$ sudo apt update
$ sudo apt install libusb-dev:armel
$ sudo apt install libjpeg-dev:armel
多分、Ubuntuのarmel向けにパッケージが公開されていればそれをsources.list
に追加して、Ubuntuでも同じことができると思うのですが、Ubuntu向けのarmelパッケージを公開しているところが見つかりません。
試しにUbuntuでftp.jp.debian.org/debianを追加してみましたが、「署名されてません」みたいなエラーが出てインストールできませんでした。そりゃそうか。
強引にインストールする方法はあるのかな?(.debを持ってきてのインストールはできたけど依存関係が大変なことになったので諦めました)
ビルド
今回ビルドしてみるプログラムはこちら。
#include <stdio.h>
#include <usb.h>
int main()
{
printf("call usb_init()\n");
usb_init();
printf("OK\n");
return 0;
}
usb_init()
を呼ぶだけという何の役にも立たないプログラム。
usb_init()
の後片付けもしません(何かする必要あったっけ、、?)。
こちらをビルド。
$ arm-linux-gnueabi-gcc -march=armv6 testUsbLib.c -o testUsbLib_armv6 -lusb
動作させてみる
上でうまくビルドができれば生成されたtestUsbLib_armv6
をRaspberry Pi Zeroの適当なフォルダにコピーして、、
$ testUsbLib_armv6
call usb_init()
OK
と、こんな感じで動きます。
何も起こりませんが、、
まとめ
libusb
は依存関係が少ないので.debファイルを取得してきての手動インストールでもどうにかなりますが、libjpeg
などは依存関係が多く、手動では手順が多すぎてあきらめました。今回の方法では依存関係含めてインストールしてくれたのでなんとか動いたようです。
ちなみに今回の方法でlibusb
、libjpeg
の他にlibtiff
の動作も確認しています。
あとはUbuntuで同様の方法が使えるのか(armel向けパッケージを公開しているところがあるのか等)についてご存じの方がいらっしゃいましたら教えてください。
追記
続きの記事を書きました。