GNU/Linux >> Linux Esercitazione >  >> Linux

Eseguire la compilazione incrociata di un'applicazione Rust da Linux a Windows

Altre risposte, sebbene tecnicamente corrette, sono più difficili di quanto dovrebbero essere. Non è necessario utilizzare rustc (infatti è sconsigliato, basta usare cargo ), ti serve solo rustup , cargo e la tua distribuzione mingw-w64.

Aggiungi l'obiettivo (puoi anche cambiarlo per qualsiasi obiettivo per cui stai compilando in modo incrociato):

rustup target add x86_64-pc-windows-gnu

Puoi costruire facilmente la tua cassa con:

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

Non c'è bisogno di scherzare con ~/.cargo/config o qualsiasi altra cosa.

EDIT:volevo solo aggiungere che mentre puoi usare quanto sopra a volte può anche essere un mal di testa. Volevo aggiungere che il team di rust tools mantiene anche un progetto chiamato cross:https://github.com/rust-embedded/crossQuesta potrebbe essere un'altra soluzione che vorresti esaminare


La distribuzione Rust fornisce solo librerie compilate per il sistema host. Tuttavia, secondo la pagina wiki di Arch Linux su Rust, puoi copiare le librerie compilate dai pacchetti di Windows nella directory di download (nota che ci sono i pacchetti i686 e x86-64) nella posizione appropriata sul tuo sistema (in /usr/lib/rustlib o /usr/local/lib/rustlib , a seconda di dove è installato Rust), installa mingw-w64-gcc e Wine e dovresti essere in grado di eseguire la compilazione incrociata.

Se stai usando Cargo, puoi dire a Cargo dove cercare ar e il linker aggiungendo questo a ~/.cargo/config (dove $ARCH è l'architettura che usi):

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

Nota:i percorsi esatti possono variare in base alla tua distribuzione. Controlla l'elenco dei file per i pacchetti mingw-w64 (GCC e binutils) nella tua distribuzione.

Quindi puoi utilizzare Cargo in questo modo:

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

AGGIORNA 11-06-2019

Questo fallisce per me con:

     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

Forse questo aiuterà https://github.com/rust-lang/rust/issues/44787

Compilazione statica sdl2

C'è un'opzione per la compilazione statica sdl ma non ha funzionato per me.

Anche il mixer non è incluso se utilizzato con bundle.

Eseguiamo la compilazione incrociata degli esempi dal progetto rust-sdl2 da Ubuntu a Windows x86_64

In ~/.cargo/config

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

Quindi esegui questo:

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 .

Crea subito esempi

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

Oppure interrompi dopo il primo fallimento:

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

Corri

cargo build inserirà i binari in target/x86_64-pc-windows-gnu/debug/examples/

Copia i file necessari:

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/

Quindi copia la directory target/x86_64-pc-windows-gnu/debug/examples/ sul tuo computer Windows ed esegui i file exe.

Esegui in cmd.exe

Se vuoi vedere l'output della console quando esegui i file exe, puoi eseguirli da cmd.exe .

Per aprire cmd.exe nella directory corrente in Esplora file, fai clic con il tasto destro con maiusc su un punto vuoto nella finestra e scegli Open command window here .

I backtrace con mingw ora dovrebbero funzionare, altrimenti usa msvc https://github.com/rust-lang/rust/pull/39234


Linux
  1. Utilizzando Windows DLL da Linux

  2. pscp copia il file in remoto da Windows a Linux

  3. Clona partizione Windows da Linux

  4. copiare il file da Windows a Linux

  5. RDP da Linux a Windows

6 funzionalità che Windows 10 ha preso da Linux

Passaggio da Windows a Linux

Come accedere alle partizioni Linux da Windows 10

Passaggio da Windows a Linux - Gestione del disco

Come installare il software Windows su Linux con Bottles

Come SSH nel tuo server Linux da Windows