🐥
Rustのarm64Linux,x64Windows向けクロスコンパイル設定
ラズパイ向けにコンパイルする際に少し調べたりしたので、今後の備忘のために残しておきます。おまけとして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)
各種クロスコンパイル
手順
- linkerをインストール
- cargoビルド時のlinker設定
- rustのクロスコンパイル用ツール追加
- クロスコンパイル実行
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