🍿
Zig言語のzig build でクロスビルド
とりあえず依存する外部ライブラリがない場合。
クロスビルドできるターゲットの一覧
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