4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

クロスコンパイルでライブラリを使う(libusb)

Posted at

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

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?