GNU/Linux >> Linux の 問題 >  >> Linux

Linux から Windows への Rust アプリケーションのクロスコンパイル

他の答えは、技術的には正しいですが、必要以上に難しいものです。 rustc を使用する必要はありません (実際には推奨されません。 cargo を使用してください。 )、必要なのは rustup だけです 、 cargo およびディストリビューションの mingw-w64.

ターゲットを追加します (クロス コンパイルするターゲットに合わせてこれを変更することもできます):

rustup target add x86_64-pc-windows-gnu

クレートは次の方法で簡単に作成できます:

cargo build --target x86_64-pc-windows-gnu

~/.cargo/config をいじる必要はありません

編集:上記を使用できる一方で、それを追加したかっただけで、頭痛の種になることもあります。私は、Rust ツール チームが cross というプロジェクトも維持していることを付け加えたいと思います:https://github.com/rust-embedded/cross

Rust ディストリビューションは、ホスト システム用にコンパイルされたライブラリのみを提供します。ただし、Rust に関する Arch Linux の wiki ページによると、ダウンロード ディレクトリ (i686 および x86-64 パッケージがあることに注意してください) の Windows パッケージからコンパイル済みライブラリをシステムの適切な場所 (/usr/lib/rustlib または /usr/local/lib/rustlib 、Rust がインストールされている場所に応じて)、mingw-w64-gcc と Wine をインストールすると、クロスコンパイルできるはずです。

Cargo を使用している場合、Cargo に ar を探す場所を伝えることができます。 これを ~/.cargo/config に追加してリンカー (ここで $ARCH は使用するアーキテクチャです):

[target.$ARCH-pc-windows-gnu]
linker = "/usr/bin/$ARCH-w64-mingw32-gcc"
ar = "/usr/$ARCH-w64-mingw32/bin/ar"

注:正確なパスは、ディストリビューションによって異なる場合があります。ディストリビューション内の mingw-w64 パッケージ (GCC および binutils) のファイルのリストを確認してください。

次に、Cargo を次のように使用できます。

$ # Build
$ cargo build --release --target "$ARCH-pc-windows-gnu"
$ # Run unit tests under wine
$ cargo test --target "$ARCH-pc-windows-gnu"

更新 2019-06-11

これは私にとって失敗します:

     Running `rustc --crate-name animation examples/animation.rs --color always --crate-type bin --emit=dep-info,link -C debuginfo=2 --cfg 'feature="default"' -C metadata=006e668c6384c29b -C extra-filename=-006e668c6384c29b --out-dir /home/roman/projects/rust-sdl2/target/x86_64-pc-windows-gnu/debug/examples --target x86_64-pc-windows-gnu -C ar=x86_64-w64-mingw32-gcc-ar -C linker=x86_64-w64-mingw32-gcc -C incremental=/home/roman/projects/rust-sdl2/target/x86_64-pc-windows-gnu/debug/incremental -L dependency=/home/roman/projects/rust-sdl2/target/x86_64-pc-windows-gnu/debug/deps -L dependency=/home/roman/projects/rust-sdl2/target/debug/deps --extern bitflags=/home/roman/projects/rust-sdl2/target/x86_64-pc-windows-gnu/debug/deps/libbitflags-2c7b3e3d10e1e0dd.rlib --extern lazy_static=/home/roman/projects/rust-sdl2/target/x86_64-pc-windows-gnu/debug/deps/liblazy_static-a80335916d5ac241.rlib --extern libc=/home/roman/projects/rust-sdl2/target/x86_64-pc-windows-gnu/debug/deps/liblibc-387157ce7a56c1ec.rlib --extern num=/home/roman/projects/rust-sdl2/target/x86_64-pc-windows-gnu/debug/deps/libnum-18ac2d75a7462b42.rlib --extern rand=/home/roman/projects/rust-sdl2/target/x86_64-pc-windows-gnu/debug/deps/librand-7cf254de4aeeab70.rlib --extern sdl2=/home/roman/projects/rust-sdl2/target/x86_64-pc-windows-gnu/debug/deps/libsdl2-3f37ebe30a087396.rlib --extern sdl2_sys=/home/roman/projects/rust-sdl2/target/x86_64-pc-windows-gnu/debug/deps/libsdl2_sys-3edefe52781ad7ef.rlib -L native=/home/roman/.cargo/registry/src/github.com-1ecc6299db9ec823/winapi-x86_64-pc-windows-gnu-0.4.0/lib`
error: linking with `x86_64-w64-mingw32-gcc` failed: exit code: 1

たぶんこれが役立つでしょう https://github.com/rust-lang/rust/issues/44787

静的コンパイル sdl2

sdl を静的コンパイルするオプションがありますが、うまくいきませんでした。

また、バンドルで使用する場合、ミキサーは含まれません。

rust-sdl2 プロジェクトのサンプルを Ubuntu から Windows x86_64 にクロスコンパイルしてみましょう

~/.cargo/config

[target.x86_64-pc-windows-gnu]
linker = "x86_64-w64-mingw32-gcc"
ar = "x86_64-w64-mingw32-gcc-ar"

次に、これを実行します:

sudo apt-get install gcc-mingw-w64-x86-64 -y
# use rustup to add target https://github.com/rust-lang/rustup.rs#cross-compilation
rustup target add x86_64-pc-windows-gnu

# Based on instructions from https://github.com/AngryLawyer/rust-sdl2/

# First we need sdl2 libs
# links to packages https://www.libsdl.org/download-2.0.php

sudo apt-get install libsdl2-dev -y
curl -s https://www.libsdl.org/release/SDL2-devel-2.0.9-mingw.tar.gz | tar xvz -C /tmp

# Prepare files for building

mkdir -p ~/projects
cd ~/projects
git clone https://github.com/Rust-SDL2/rust-sdl2
cd rust-sdl2
cp -r /tmp/SDL2-2.0.9/x86_64-w64-mingw32/lib/* ~/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-gnu/lib/
cp /tmp/SDL2-2.0.9/x86_64-w64-mingw32/bin/SDL2.dll .

サンプルを一度に作成

cargo build --target=x86_64-pc-windows-gnu --verbose --examples

または最初の失敗後に停止:

echo; for i in examples/*; do [ $? -eq 0 ] && cargo build --target=x86_64-pc-windows-gnu --verbose --example $(basename $i .rs); done

走る

cargo build target/x86_64-pc-windows-gnu/debug/examples/ にバイナリを配置します

必要なファイルをコピー:

cp /tmp/SDL2-2.0.4/x86_64-w64-mingw32/bin/SDL2.dll target/x86_64-pc-windows-gnu/debug/examples/
cp assets/sine.wav target/x86_64-pc-windows-gnu/debug/examples/

次に、ディレクトリ target/x86_64-pc-windows-gnu/debug/examples/ をコピーします Windows マシンにコピーして、exe ファイルを実行してください。

cmd.exe で実行

exe ファイルを実行しているときにコンソール出力を見たい場合は、それらを cmd.exe から実行できます。 .

cmd.exe を開くには ファイルエクスプローラーの現在のディレクトリで、ウィンドウの空の場所をShiftキーを押しながら右クリックし、Open command window hereを選択します .

mingw を使用したバックトレースが機能するようになりました - msvc を使用しない場合は https://github.com/rust-lang/rust/pull/39234


Linux
  1. XRDPを使用してWindowsからLinuxデスクトップにデスクトップをリモート接続する方法

  2. Cygwin を使用して Windows から Linux 上のソフトウェア インストーラーを起動する

  3. Linux マシンにインストールされた OpenGL アプリケーションを Windows マシンから実行するにはどうすればよいですか?

  1. PuTTYを使用してWindowsからLinuxに接続する

  2. Linux から Windows DLL を使用する

  3. Linux ターミナルから Windows マシンをシャットダウンする

  1. パテを使用して Windows から Linux に scp する

  2. pscp Windows から Linux にリモートでファイルをコピーする

  3. Linux から Windows パーティションをクローン