Rustのクロスコンパイル(Linux, MacOSで作ったものをWindowsで動かす)
LinuxやMacで開発したものがWindowsでも動いたら便利ですよね。
Goと違ってRustはクロスコンパイルに非常に苦労しました。2つの方法を示すので、きっとどちらかで成功すると思います。
cross というライブラリを使う方法
初めにrustupとDockerをインストールしておきます。rustupは普通にrustをインストールすれば入っています。
Dockerはコンテナ型仮想化のソフトウェアです。ない人はDocker Storeからちゃちゃっとダウンロードしてインストールしてください。クロスコンパイルをするためにはDockerを起動しておく必要がありますが、Dockerを操作するわけではないので心配しなくて大丈夫です!
Dockerを起動して、あとは下記コマンドを実行すればインストール完了です。
cargo install cross
次に実際にクロスコンパイルするために、コンパイルのターゲットを確認します。ターミナルから下記コマンドを実行すればいいでしょう。
~> rustc --print target-list | grep windows
i586-pc-windows-msvc
i686-pc-windows-gnu
i686-pc-windows-msvc
x86_64-pc-windows-gnu
x86_64-pc-windows-msvc
windows向けのものが5つ見つかりました。今回はwindows 10 amd64アーキテクチャ向けにコンパイルしたいので、x86_64-pc-windows-gnu
を使っていきます。
cross build --target x86_64-pc-windows-gnu
これだけでBuildに成功するはずです!
CentOS7ではこれで成功したのですが、Macではうまくいきませんでした…
MacOSでは下記の方法でうまくいきました。
rustup を使う方法
rustup target add x86_64-pc-windows-gnu
このままビルドするとlinkerが足りないというエラーが出てしまうので、gccのコンパイラをインストールします(MacOS)
brew install mingw-w64
Ubuntuのときは下記のように
sudo apt install mingw-w64
そしてcargoのコンフィグファイル(デフォルトでは~/.cargo/config)に以下のものを書き込みます。存在しない場合は作ってください。
[target.i686-pc-windows-gnu]
linker = "i686-w64-mingw32-gcc"
[target.x86_64-pc-windows-gnu]
linker = "x86_64-w64-mingw32-gcc"
この状態で下記コマンドを実行すれば main.exe などのWindows向けバイナリが作成されます。
cargo build --target x86_64-pc-windows-gnu
完成品(.exe)は下記にあるはずです
プロジェクトフォルダ/target/x86_64-w64-mingw32-gcc/debug/main.exe
<参考>下記コマンドを実行することでインストールしてあるターゲットを確認できます。
rustup show
終わりに
Goでは GOOS=windows GOARCH=amd64 go build ファイル名 で一発でクロスコンパイルできて非常に便利です。もちろんRustにも標準のものがあって下記のGitHubがRustのクロスコンパイルリソースまとめです。しかしこの方法ではまったくコンパイルできなくて困りました。私がミスしているだけかもしれませんが、一応参考までにリンク貼っておきます。
GitHub - japaric/rust-cross: Everything you need to know about cross compiling Rust programs!