web-dev-qa-db-ja.com

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

基本的に、Linuxでの開発中に、最も単純なコードをWindowsにコンパイルしようとしています。

fn main() {
    println!("Hello, and bye.")
}

インターネットを検索してこれらのコマンドを見つけました。

rustc --target=i686-w64-mingw32-gcc  main.rs
rustc --target=i686_pc_windows_gnu -C linker=i686-w64-mingw32-gcc  main.rs

悲しいことに、それらのどれも動作しません。 std crate missingについてのエラーが表示されます

$ rustc --target=i686_pc_windows_gnu -C linker=i686-w64-mingw32-gcc  main.rs 

main.rs:1:1: 1:1 error: can't find crate for `std`
main.rs:1 fn main() {
          ^
error: aborting due to previous error

LinuxでWindowsで実行されるコードをコンパイルする方法はありますか?

31
Fedcomp

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

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

[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"
25
Francis Gagné

[〜#〜] update [〜#〜]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を静的コンパイルするオプションがありますが、それは 私にとっては機能しませんでした です。

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

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

~/.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 buildtarget/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を開くには、ウィンドウの空の場所で右クリックして[Open command window here]を選択します。

Mingwを使用したバックトレースが動作するようになりました-msvcを使用しない場合 https://github.com/Rust-lang/Rust/pull/39234

15
rofrol

Debianで成功しました(テスト)MingwとWineを使用しない公式の指示 の直後。彼らは恐ろしく見えますが、最終的にはそれほど害はありませんでした。

公式の手順には、C/C++コードをクロスコンパイルする方法に関する情報も含まれています。私はそれを必要としなかったので、実際にテストしていないものです。

公式指示書の個々のポイントに関するいくつかの発言。番号は、 公式の指示 の番号と一致します。

  1. Debian:Sudo apt-get install lld
  2. lld-linkという名前のシンボリックリンクをlldに作成します$ PATHのどこか。例:ln -s /usr/bin/lld local_bin/lld-link
  3. 私はC/C++をクロスコンパイルしません。この点を個人的に使用したことはありません。
  4. これはおそらく最も厄介な部分です。 Rust rustupを介してWindowsボックスにインストールし、公式ドキュメントで指定されたディレクトリからLinuxボックスにライブラリをコピーしました。小文字(Windowsは大文字と小文字を区別せず、Linuxは大文字と小文字を区別しません。現在のディレクトリ内のすべてのファイルの名前を小文字に変更するために次のコードを使用しました。

    for f in `find`; do mv -v "$f" "`echo $f | tr '[A-Z]' '[a-z]'`"; done
    

    個人的には、Kitディレクトリと[〜#〜] vc [〜#〜] dirsの両方が必要です。

  5. 私はC/C++をクロスコンパイルしません。この点を個人的に使用したことはありません。
  6. このポストの最後にあるスクリプトで$LIB_ROOTを作成して、ポイント3からlibディレクトリを指定します。
  7. 必須
  8. 私はC/C++をクロスコンパイルしません。この点を個人的に使用したことはありません。
  9. ターゲットアーキテクチャに応じて、次のいずれか:
    • rustup target add i686-pc-windows-msvc
    • rustup target add x86_64-pc-windows-msvc

クロスビルド自体には、次の単純なスクリプト(32ビットバージョン)を使用しています。

#!/bin/sh
# "cargo build" for the 32-bit Windows MSVC architecture.

# Set this to proper directory
LIB_ROOT=~/opt/Rust-msvc

# The rest shouldn't need modifications
VS_LIBS="$LIB_ROOT/Microsoft Visual Studio 14.0/VC/lib/"
KIT_8_1_LIBS="$LIB_ROOT/Windows Kits/8.1/Lib/winv6.3/um/x86/"
KIT_10_LIBS="$LIB_ROOT/Windows Kits/10/Lib/10.0.10240.0/ucrt/x86/"
export LIB="$VS_LIBS;$KIT_8_1_LIBS;$KIT_10_LIBS"
cargo build --target=i686-pc-windows-msvc "$@"

私はcargo buildを使用するのと同じ方法でスクリプトを使用しています

それが誰かを助けることを願っています!

0