RaspberryPiで使える某入退室管理システムをPython2のNFCPyからCベースのものに置き換えるためにクロスコンパイル環境をDocker上で用意しようと思いあれ?となりいろいろ調べたのでそのメモです。
TL;DR
debian系のLinuxで下記のコマンドを実行する
# RaspberryPi向けのアーキテクチャもインストール可能にする
dpkg --add-architecture armhf
# クロスコンパイル用のツールをインストールする
apt install -y crossbuild-essential-armhf
# RaspberryPi向けのアーキテクチャのlibusb1.0.0をインストールする
apt install -y libusb-1.0-0-dev:armhf
解説
クロスコンパイルする際にリンクするライブラリもコンパイルするアーキテクチャに対応したものを用意する必要がありますが、通常aptなどでインストールするとコンパイルをする環境のアーキテクチャ(例えばamd64など)に対応するライブラリがインストールされます。
さてどうすればいいのかと少し悩みましたが、簡単に言えばRaspberryPi向けのアーキテクチャ(armhf)もインストールを可能にすればいいのです。
まず始めにパッケージ管理ツール(dpkg)にarmhfアーキテクチャのパッケージもインストールできるように設定する必要があります。
dpkg --add-architecture armhf
でarmhfを追加します。
あとは対応したアーキテクチャのパッケージをaptでインストールします。
ここではlibusbをインストールしていますが、対応しているパッケージであればapt install -y libusb-1.0-0-dev:armhf
のようにパッケージ名の後ろに:armhf
などアーキテクチャをつけるとインストールできます。
最後におまけですがクロスコンパイル環境を用意したいので
apt install -y crossbuild-essential-armhf
などで忘れずにクロスコンパイル用のツールをインストールしてください。
Dockerfile
冒頭にDocker上でクロスコンパイル環境を用意したいと言った通りDockerfileも用意しています。
Dockerfileの場合は以下の通りです。ちなみに見ると分かりますがgoでのコンパイルにも対応しています。
FROM golang:1.13.6-stretch
RUN dpkg --add-architecture armhf
RUN apt update && apt install -y crossbuild-essential-armhf libusb-1.0-0-dev:armhf
ENV CC arm-linux-gnueabihf-gcc
ENV CXX arm-linux-gnueabihf-g++
ENV CGO_ENABLED 1
ENV GOOS linux
ENV GOARCH arm
あとがき
クロスコンパイルでlibusbなどのライブラリを使う方法がなかなかわからず苦戦したのでまとめてみました。
これで同じように悩む人が減ることを願っています。
もし間違いなどがあればご指摘いただければ幸いです。
Reference