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