GNU/Linux >> Znalost Linux >  >> Linux

Křížově zkompilujte aplikaci Rust z Linuxu do Windows

Jiné odpovědi, i když jsou technicky správné, jsou obtížnější, než by bylo nutné. Není třeba používat rustc (ve skutečnosti se to nedoporučuje, stačí použít cargo ), potřebujete pouze rustup , cargo a mingw-w64 vaší distribuce.

Přidejte cíl (můžete to také změnit pro jakýkoli cíl, pro který křížově kompilujete):

rustup target add x86_64-pc-windows-gnu

Svou bednu můžete snadno postavit pomocí:

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

Není třeba si pohrávat s ~/.cargo/config nebo cokoli jiného.

EDIT:Chtěl jsem jen dodat, že i když můžete použít výše uvedené, může to také někdy bolet hlava. Chtěl jsem dodat, že tým rust tools také udržuje projekt nazvaný cross:https://github.com/rust-embedded/crossToto může být další řešení, na které se chcete podívat


Distribuce Rust poskytuje pouze zkompilované knihovny pro hostitelský systém. Nicméně podle wiki stránky Arch Linuxu na Rustu byste mohli zkopírovat zkompilované knihovny z balíčků Windows v adresáři pro stahování (všimněte si, že existují balíčky i686 a x86-64) na příslušné místo ve vašem systému (v /usr/lib/rustlib nebo /usr/local/lib/rustlib , v závislosti na tom, kde je nainstalován Rust), nainstalujte mingw-w64-gcc a Wine a měli byste být schopni křížové kompilace.

Pokud používáte Cargo, můžete Cargo říct, kde má hledat ar a linker přidáním tohoto do ~/.cargo/config (kde $ARCH je architektura, kterou používáte):

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

Poznámka:Přesné cesty se mohou lišit v závislosti na vaší distribuci. Zkontrolujte seznam souborů pro balíček(y) mingw-w64 (GCC a binutils) ve vaší distribuci.

Pak můžete použít Cargo takto:

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

AKTUALIZACE 2019-06-11

Toto se mi nedaří s:

     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

Možná to pomůže https://github.com/rust-lang/rust/issues/44787

Statická kompilace sdl2

Existuje možnost statického zkompilování sdl, ale to mi nefungovalo.

Při použití s ​​přibaleným není součástí dodávky ani mixér.

Pojďme křížově zkompilovat příklady z projektu rust-sdl2 z Ubuntu do Windows x86_64

V ~/.cargo/config

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

Potom spusťte toto:

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 .

Vytvořte příklady najednou

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

Nebo zastavte po prvním selhání:

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

Spustit

cargo build vloží binární soubory do target/x86_64-pc-windows-gnu/debug/examples/

Zkopírujte potřebné soubory:

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/

Poté zkopírujte adresář target/x86_64-pc-windows-gnu/debug/examples/ do počítače se systémem Windows a spusťte soubory exe.

Spusťte v cmd.exe

Pokud chcete vidět výstup konzoly při spouštění souborů exe, můžete je spustit z cmd.exe .

Chcete-li otevřít cmd.exe v aktuálním adresáři v průzkumníku souborů klikněte pravým tlačítkem se shiftem na prázdné místo v okně a zvolte Open command window here .

Zpětné sledování s mingw by nyní mělo fungovat - pokud ne, použijte msvc https://github.com/rust-lang/rust/pull/39234


Linux
  1. Připojte se k Linuxu z Windows pomocí PuTTY

  2. Spusťte instalační programy na Linuxu z Windows pomocí Cygwin

  3. Použití putty pro scp z Windows do Linuxu

  1. Jak vzdálenou plochu z Windows na plochu Linuxu pomocí XRDP

  2. Jak mohu spustit aplikaci OpenGL nainstalovanou na linuxovém počítači ze svého počítače se systémem Windows?

  3. Klonujte oddíl Windows z Linuxu

  1. Použití Windows DLL z Linuxu

  2. Vypněte počítač se systémem Windows z linuxového terminálu

  3. pscp zkopírujte soubor vzdáleně z Windows do Linuxu