Rust メモ Windows向けにクロスコンパイル
Windowsでも使いたいコードがあり、Linux上でWindows向けにクロスコンパイルをしてみたメモ。 rustupを使うと簡単にクロスコンパイルができる。
windows向けのtargetを探す
$ rustup target list | grep win i586-pc-windows-msvc i686-apple-darwin i686-pc-windows-gnu i686-pc-windows-msvc x86_64-apple-darwin x86_64-pc-windows-gnu x86_64-pc-windows-msvc
今回は x86_64-pc-windows-gnu
を追加する
rustup target add x86_64-pc-windows-gnu $ rustup target add x86_64-pc-windows-gnu info: downloading component 'rust-std' for 'x86_64-pc-windows-gnu' info: installing component 'rust-std' for 'x86_64-pc-windows-gnu'
これを --target
にしてビルドするが、その前に mingw-w64
をインストール
$ sudo apt install mingw-w64 Unpacking gcc-mingw-w64-base (4.8.2-10ubuntu2+12) ... Selecting previously unselected package gcc-mingw-w64-i686. Preparing to unpack .../gcc-mingw-w64-i686_4.8.2-10ubuntu2+12_amd64.deb ... Unpacking gcc-mingw-w64-i686 (4.8.2-10ubuntu2+12) ... Selecting previously unselected package g++-mingw-w64-i686. Preparing to unpack .../g++-mingw-w64-i686_4.8.2-10ubuntu2+12_amd64.deb ... Unpacking g++-mingw-w64-i686 (4.8.2-10ubuntu2+12) ... Selecting previously unselected package mingw-w64-x86-64-dev. Preparing to unpack .../mingw-w64-x86-64-dev_3.1.0-1_all.deb ... Unpacking mingw-w64-x86-64-dev (3.1.0-1) ... Selecting previously unselected package gcc-mingw-w64-x86-64. Preparing to unpack .../gcc-mingw-w64-x86-64_4.8.2-10ubuntu2+12_amd64.deb ... Unpacking gcc-mingw-w64-x86-64 (4.8.2-10ubuntu2+12) ... Selecting previously unselected package g++-mingw-w64-x86-64. Preparing to unpack .../g++-mingw-w64-x86-64_4.8.2-10ubuntu2+12_amd64.deb ... Unpacking g++-mingw-w64-x86-64 (4.8.2-10ubuntu2+12) ... Selecting previously unselected package g++-mingw-w64. Preparing to unpack .../g++-mingw-w64_4.8.2-10ubuntu2+12_all.deb ... Unpacking g++-mingw-w64 (4.8.2-10ubuntu2+12) ... Selecting previously unselected package gcc-mingw-w64. Preparing to unpack .../gcc-mingw-w64_4.8.2-10ubuntu2+12_all.deb ... Unpacking gcc-mingw-w64 (4.8.2-10ubuntu2+12) ... Selecting previously unselected package gfortran-mingw-w64-i686. Preparing to unpack .../gfortran-mingw-w64-i686_4.8.2-10ubuntu2+12_amd64.deb ... Unpacking gfortran-mingw-w64-i686 (4.8.2-10ubuntu2+12) ... Selecting previously unselected package gfortran-mingw-w64-x86-64. Preparing to unpack .../gfortran-mingw-w64-x86-64_4.8.2-10ubuntu2+12_amd64.deb ... Unpacking gfortran-mingw-w64-x86-64 (4.8.2-10ubuntu2+12) ... Selecting previously unselected package gfortran-mingw-w64. Preparing to unpack .../gfortran-mingw-w64_4.8.2-10ubuntu2+12_all.deb ... Unpacking gfortran-mingw-w64 (4.8.2-10ubuntu2+12) ... Selecting previously unselected package gnat-mingw-w64-base. Preparing to unpack .../gnat-mingw-w64-base_4.8.2-12ubuntu2+12.1_amd64.deb ... Unpacking gnat-mingw-w64-base (4.8.2-12ubuntu2+12.1) ... Selecting previously unselected package gnat-mingw-w64-i686. Preparing to unpack .../gnat-mingw-w64-i686_4.8.2-12ubuntu2+12.1_amd64.deb ... Unpacking gnat-mingw-w64-i686 (4.8.2-12ubuntu2+12.1) ... Selecting previously unselected package gnat-mingw-w64-x86-64. Preparing to unpack .../gnat-mingw-w64-x86-64_4.8.2-12ubuntu2+12.1_amd64.deb ... Unpacking gnat-mingw-w64-x86-64 (4.8.2-12ubuntu2+12.1) ... Selecting previously unselected package gnat-mingw-w64. Preparing to unpack .../gnat-mingw-w64_4.8.2-12ubuntu2+12.1_all.deb ... Unpacking gnat-mingw-w64 (4.8.2-12ubuntu2+12.1) ... Selecting previously unselected package mingw-w64. Preparing to unpack .../mingw-w64_3.1.0-1_all.deb ... Unpacking mingw-w64 (3.1.0-1) ... Processing triggers for man-db (2.6.7.1-1ubuntu1) ... Setting up binutils-mingw-w64-i686 (2.23.52.20130620-1ubuntu1+3build1) ... Setting up binutils-mingw-w64-x86-64 (2.23.52.20130620-1ubuntu1+3build1) ... Setting up mingw-w64-common (3.1.0-1) ... Setting up mingw-w64-i686-dev (3.1.0-1) ... Setting up gcc-mingw-w64-base (4.8.2-10ubuntu2+12) ... Setting up gcc-mingw-w64-i686 (4.8.2-10ubuntu2+12) ... Setting up g++-mingw-w64-i686 (4.8.2-10ubuntu2+12) ... Setting up mingw-w64-x86-64-dev (3.1.0-1) ... Setting up gcc-mingw-w64-x86-64 (4.8.2-10ubuntu2+12) ... Setting up g++-mingw-w64-x86-64 (4.8.2-10ubuntu2+12) ... Setting up g++-mingw-w64 (4.8.2-10ubuntu2+12) ... Setting up gcc-mingw-w64 (4.8.2-10ubuntu2+12) ... Setting up gfortran-mingw-w64-i686 (4.8.2-10ubuntu2+12) ... Setting up gfortran-mingw-w64-x86-64 (4.8.2-10ubuntu2+12) ... Setting up gfortran-mingw-w64 (4.8.2-10ubuntu2+12) ... Setting up gnat-mingw-w64-base (4.8.2-12ubuntu2+12.1) ... Setting up gnat-mingw-w64-i686 (4.8.2-12ubuntu2+12.1) ... Setting up gnat-mingw-w64-x86-64 (4.8.2-12ubuntu2+12.1) ... Setting up gnat-mingw-w64 (4.8.2-12ubuntu2+12.1) ... Setting up mingw-w64 (3.1.0-1) ...
そしてビルドするとエラーが出る。こんな感じで。
$ cargo build --target x86_64-pc-windows-gnu Compiling ... v0.1.0 ( ) error: linking with `gcc` failed: exit code: 1 | = note: "gcc" "-Wl,--enable-long-section-names" "-fno-use-linker-plugin" "-Wl,--nxcompat" "-nostdlib" "-m64" "..." "..." "-L" "..." "..." "-o" "..." "-Wl,--gc-sections" "-nodefaultlibs" "-L" "..." "-L" "..." "-Wl,-Bstatic" "-Wl,-Bdynamic" "..." "..." "..." "..." "..." "..." "..." "..." "..." "..." "..." "-l" "ws2_32" "-l" "userenv" "-l" "shell32" "-l" "advapi32" "-l" "gcc_eh" "-lmingwex" "-lmingw32" "-lgcc" "-lmsvcrt" "-luser32" "-lkernel32" "..." = note: /usr/bin/ld: unrecognized option '--enable-long-section-names' /usr/bin/ld: use the --help option for usage information collect2: error: ld returned 1 exit status error: aborting due to previous error error: Could not compile `dumpdir`. To learn more, run the command again with --verbose.
既知の問題のようだ。
https://github.com/rust-lang/rust/issues/32859
ひとまずこれで回避できるとのこと。
$ cat .cargo/config [target.i686-pc-windows-gnu] linker = "i686-w64-mingw32-gcc" [target.x86_64-pc-windows-gnu] linker = "x86_64-w64-mingw32-gcc"
できた
$ cargo build --target x86_64-pc-windows-gnu Compiling .... v0.1.0 (file:///.....) Finished debug [unoptimized + debuginfo] target(s) in 0.19 secs
補足
各種バージョン情報
$ rustup --version rustup 0.6.5 (88ef618 2016-11-04) $ rustc --version rustc 1.13.0 (2c6933acc 2016-11-07) $ cargo --version cargo 0.13.0-nightly (eca9e15 2016-11-01) $ uname -a Linux workspace 3.13.0-92-generic #139-Ubuntu SMP Tue Jun 28 20:42:26 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux $ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=14.04 DISTRIB_CODENAME=trusty DISTRIB_DESCRIPTION="Ubuntu 14.04.4 LTS"