🍿

Zig言語のzig build でクロスビルド

2023/05/23に公開

とりあえず依存する外部ライブラリがない場合。

クロスビルドできるターゲットの一覧

zig targets

armのlinux向けをさがす

$ zig targets |grep 'arm.*linux'
  "armeb-linux-gnueabi",
  "armeb-linux-gnueabihf",
  "armeb-linux-musleabi",
  "armeb-linux-musleabihf",
  "arm-linux-gnueabi",
  "arm-linux-gnueabihf",
  "arm-linux-musleabi",
  "arm-linux-musleabihf",

クロスビルド

arm-linux-gnueabihf向けにビルドする。32bitのRaspberryPi OSにはこれがよい。

ビルド先を指定して、クロスビルドする。 (指定しないとzig-out/binに上書きされる)

zig build --prefix-exe-dir armhf -Dtarget=arm-linux-gnueabihf -Doptimize=ReleaseSafe
$ file zig-out/armhf/v4l2capture 
zig-out/armhf/v4l2capture: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 2.0.0, with debug_info, not stripped

余談: muslとgnuのライブラリの使い分け

サイズを小さく、ライブラリの依存性を最小にするならmuslを選ぶ。static linkされる。

glibcの機能を使うならgnueabiを選ぶ。libc はダイナミックリンクされるので、ターゲットのlibcが想定しているものより古いと動かないことがある。

muslになくて、glibcにある機能。
ひとつには、ネットワークのホスト名の解決にmDNSを使うこと。

Discussion