ラスタシアンに捧ぐ

Rustを書く人、Rustacean。Rustという素晴らしい言語を広めるために活動中。

Rustのクロスコンパイル(Linux, MacOSで作ったものをWindowsで動かす)

LinuxMacで開発したものがWindowsでも動いたら便利ですよね。

Goと違ってRustはクロスコンパイルに非常に苦労しました。2つの方法を示すので、きっとどちらかで成功すると思います。

cross というライブラリを使う方法

github.com

初めに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!