selecao3のブログ

技術系の備忘録

macOSでWindowsターゲットでクロスコンパイルする

macOSWindowsターゲットでクロスコンパイルする

 環境

macOSでRustのコードをWindowsターゲットでクロスコンパイルするのに少々手こずったのでメモ

 

 手順

  1. mingw-w64のインストール
    必要なライブラリをbrew からインストール
    # brew install mingw-w64
  2. ~/.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ファイルがない場合は作成する。
  3. macOSWindowsターゲットでクロスコンパイル
    以下のコマンドを実行
    # 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へコピーすれば解決するはず。多分