🐥

Rustのarm64Linux,x64Windows向けクロスコンパイル設定

2024/09/18に公開


ラズパイ向けにコンパイルする際に少し調べたりしたので、今後の備忘のために残しておきます。おまけとしてWindows向けも残しておきます。

前提

コンパイル環境

$ cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
$ uname -m
x86_64
$ rustup --version
rustup 1.27.1 (54dd3d00f 2024-04-24)
info: This is the version for the rustup toolchain manager, not the rustc compiler.
info: The currently active `rustc` version is `rustc 1.81.0 (eeb90cda1 2024-09-04)`
$ cargo --version
cargo 1.81.0 (2dbb1af80 2024-08-20)

各種クロスコンパイル

手順

  1. linkerをインストール
  2. cargoビルド時のlinker設定
  3. rustのクロスコンパイル用ツール追加
  4. クロスコンパイル実行

Linux arm64 動的リンク

# install linker
sudo apt update
sudo apt install -y gcc-aarch64-linux-gnu
# set linker for cargo
cd project_dir
cat << EOF | ./.cargo/config.toml > /dev/null
[target.aarch64-unknown-linux-gnu]
linker = "aarch64-linux-gnu-gcc"
EOF
# add cross compile toolchain of rust
rustup target add aarch64-unknown-linux-gnu
# compile
cargo build --target aarch64-unknown-linux-gnu --release

Linux arm64 静的リンク

使用するクレートもmuslでバイナリを作成する必要があるためエラーとなる可能性がある。

# install linker
sudo apt update
sudo apt install -y gcc-aarch64-linux-gnu
# set linker for cargo
cd project_dir
cat << EOF | ./.cargo/config.toml > /dev/null
[target.aarch64-unknown-linux-musl]
linker = "aarch64-linux-gnu-gcc"
EOF
# add cross compile toolchain of rust
rustup target add aarch64-unknown-linux-musl
# compile
cargo build --target aarch64-unknown-linux-musl --release

Windows x64

# install linker
sudo apt update
sudo apt install -y gcc-mingw-w64-x86-64-win32
# set linker for cargo
cd project_dir
cat << EOF | ./.cargo/config.toml > /dev/null
[target.x86_64-pc-windows-gnu]
linker = "x86_64-w64-mingw32-gcc"
EOF
# add cross compile toolchain of rust
rustup target add x86_64-pc-windows-gnu
# compile
cargo build --target x86_64-pc-windows-gnu --release

Linux x64 静的リンク

使用するクレートもmuslでバイナリを作成する必要があるためエラーとなる可能性がある。

# install linker
sudo apt update
sudo apt install -y build-essential
# add cross compile toolchain of rust
rustup target add x86_64-unknown-linux-musl
# compile
cargo build --target x86_64-unknown-linux-musl --release

Linux x64 動的リンク

x86_64 Debianであれば通常以下の設定は不要。 (cargo build --releaseだけでいい)

# install linker
sudo apt update
sudo apt install -y build-essential
# add cross compile toolchain of rust
rustup target add x86_64-unknown-linux-gnu
# compile
cargo build --target x86_64-unknown-linux-gnu --release

その他

クロスコンパイルリスト表示

rustup target list | pr -w 120 --columns=3

Linkerに設定するバイナリ名確認

ls /usr/bin

デフォルトビルド設定

project_dir/.cargo/config.toml
[build]
target="aarch64-unknown-linux-gnu"

armv7-unknown-linux-gnueabihfとは

  • 32bit armアーキテクチャ用
  • hf = Hard float = cpu組み込みfloating演算命令使用

参考文献

Discussion