macOSでWindowsターゲットでクロスコンパイルする
macOSでWindowsターゲットでクロスコンパイルする
環境
- macOS
- rustup 1.17.0
macOSでRustのコードをWindowsターゲットでクロスコンパイルするのに少々手こずったのでメモ
手順
- mingw-w64のインストール
必要なライブラリをbrew からインストール
# brew install mingw-w64 - ~/.cargo/configに以下の記述を追加
[target.x86_64-pc-windows-gnu] linker = "x86_64-w64-mingw32-gcc" [target.i686-pc-windows-gnu] linker = "i686-w64-mingw32-gcc"
configファイルがない場合は作成する。 - macOSでWindowsターゲットでクロスコンパイル
以下のコマンドを実行
# rustup target add x86_64-pc-windows-gnu
# cargo build --target x86_64-pc-windows-gnu
ここまですればイケるらしいが自分は"undefined reference to `__onexitbegin"というようなエラーが出た。
以下は、手順3. まで行ってもうまくクロスコンパイルが出なかった場合 or エラー文の中に"crt2.o"というオブジェクトファイルがある方は以下のコマンドを実行してみるといいかもしれない。
# cd $HOME
# cd .rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/x86_64-pc-windows-gnu/lib
# mv crt2.o crt2.o.bak
# cp /usr/local/Cellar/mingw-w64/6.0.0/toolchain-x86_64/x86_64-w64-mingw32/lib/crt2.o ./
参考URL
https://github.com/rust-lang/rust/issues/48272#issuecomment-429596397
crt2.oというオブジェクトファイルがうまく機能していないのは分かったがよく分かんないっす....
ちなみに
Ubuntu 18.04でも同様の症状が出た。
/usr/x86_64-w64-mingw32/lib/crt2.oを.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/x86_64-pc-windows-gnu/libへコピーすれば解決するはず。多分