Rustのクロスコンパイルに振り回された話
Rust、始めました 私がインフルにかかったとき、あまりにも暇だったため、Rustの勉強をすることにしました。 そこで分かったことは、Rustではcrossというツールを利用してクロスコンパイルができるということです。 crossについて crossの仕組み 噛み砕いて言うと、Rustで書いたコードを、Dockerコンテナ内でコンパイルするというものです。 Dockerは、PC内に仮想環境を作り、そこで動かすことのできるツールで、これにより環境に縛られないビルドやテストなどを実行できるようになったため、主にクロスコンパイルやCI/CDとして利用されています。 インストール Crossの強みは、そのインストールの容易さにもあります。 cargo install cross --git https://github.com/cross-rs/cross 驚かないでください。 なんと、これだけなんです! というのも、Rustのコンパイラがもともとクロスコンパイルをサポートするように設計されているため、少ない手順でセットアップができるようになっているのです。 crossでクロスコンパイルしてみよう! cargo new test-project # 新しいプロジェクトを作る // main.rs fn main() { println!("Hello World!"); } 適当にHelloWorldを組んでみました。 普通なら cargo build --release でコンパイルすると思いますが、今日はここでcrossを使ってみます。 1. ターゲットを追加 まず、rustupコマンドを使用してターゲットを使用できるようにします。 rustup target add <target> ここでのターゲットは、システムのアーキテクチャを指します。 例えば、aarch64-unknown-linux-gnu (Raspberry Pi 4+) などですね。 rustup target list で一覧を見ることができます。 注)稀にツールチェーンのインストールをしないといけないことがあります: rustup toolchain install stable-x86_64-unknown-linux-gnu 2. crossでコンパイル cross build --target aarch64-unknown-linux-gnu # 適切なターゲットを指定してください 基本はcargoを差し替えるようにして利用できます。 ※普通に比べ速度が制限されるため、少しコンパイル時間が伸びることがあります。 しばらくすると、cargoでビルドした場合と同じようにビルド終了のログが流れ、ビルドが終了します。また、通常通りtargetディレクトリにビルド結果が残されます。 3. 実機で実行 ビルド結果の実行可能ファイルを実機にコピーして実行すれば、終わりです。 ありがとうございました。 ここで問題が… ですが、終わりません。 ...