RustでWindows⇔Linuxをクロスコンパイルする

概要

クロスコンパイル(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

.cargo/config
[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言語は比較的容易にクロスコンパイルできることが分かりました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA