概要
クロスコンパイル(cross compile)とは、開発する機種とは別のOSやCPU環境で動作するバイナリファイルをコンパイルする機能です。これをしないと、Windows10の64bit環境デコンパイルしたバイナリファイルは同様の環境でなければ動作しませんし、逆にUbuntu等でコンパイルしたバイナリファイルをWindowsで動作させることができません。Rust言語はこのクロスコンパイルが比較的簡単にできましたのでやり方を整理しておきます。
WindowsでLinux向けのバイナリファイルをビルドする
以下サイトの情報を参考に、まずcrossというコマンドが使えるようにします。
https://media.itkaikei.com/2019/01/24/rust-cross-compile/
cargo install cross
次に対象の環境を選びます。2通りのコマンドがあります。
#方法その1 rustc --print target-list #方法その2 rustup target list
私の環境では以下の環境向けの実行ファイルがコンパイルできるようです。たくさん種類があり、内容を十分に把握できていませんが、黄色塗りにしている2つ(64bitのwindonws向け:x86_64-pc-windows-gnu、64bitのLinux向け:x86_64-unknown-linux-gnu)を対象にします。
それではクロスコンパイルしましょう。普段cargo buildをしている場所で以下のコマンドを実行すればOKです。
cross build --target x86_64-unknown-linux-gnu
以下はチュートリアルで取り挙げられていたguessing_gameをクロスコンパイルしたものです。ビルドに必要なファイルが自動的にインストールされ、linux向けのバイナリファイルをビルドすることが出来ました。
試しにUbuntu18.04のコンテナで実行したらきちんと動作しました。
LinuxでWindows向けのバイナリファイルをコンパイルする
基本的には同じです。↓のコードでexeファイルが作成されます。
cross build --target x86_64-pc-windows-gnu
なお、crossを使わない方法もメモ書き程度に残しておきます。以下のサイトを参考にさせていただきました。
https://ryochack.hatenablog.com/entry/2017/10/22/014735
本処理はUbuntu18.04で実行しています。まず、64bitのwindows向けバイナリファイルをコンパイルするのに必要なリンカをインストールします。
sudo apt install mingw-w64
このリンカを用いることをプロジェクトの設定ファイルに記述します。設定ファイルの置き場所は.cargoフォルダの中で、ファイルの名称はconfigです。リンカは以下のサイトの情報が分かり易かったです。
https://www.grapecity.com/developer/support/powernews/column/clang/003/page01.htm
記載内容は以下のようになります。
https://developer.moe/cross-compiling-applications-with-rust
[target.x86_64-pc-windows-gnu] linker = "x86_64-w64-mingw32-gcc"
コンパイル対象に加えます。
rustup target add x86_64-pc-windows-gnu #加えられているかどうか確認 rustup target list
最後にビルドします。
cargo build --target x86_64-pc-windows-gnu
この方法は、windows→linuxでは難しいそうです。
https://users.rust-lang.org/t/how-to-cross-compile-linux-binaries-with-rust-from-windows-hosts/15218
終わりに
Rust言語は比較的容易にクロスコンパイルできることが分かりました。