D'autres réponses, bien que techniquement correctes, sont plus difficiles qu'elles ne devraient l'être. Il n'est pas nécessaire d'utiliser rustc
(en fait c'est déconseillé, utilisez simplement cargo
), vous n'avez besoin que de rustup
, cargo
et le mingw-w64 de votre distribution.
Ajoutez la cible (vous pouvez également la modifier pour la cible pour laquelle vous effectuez une compilation croisée) :
rustup target add x86_64-pc-windows-gnu
Vous pouvez construire votre caisse facilement avec :
cargo build --target x86_64-pc-windows-gnu
Pas besoin de jouer avec ~/.cargo/config
ou quoi que ce soit d'autre.
EDIT :Je voulais juste ajouter que même si vous pouvez utiliser ce qui précède, cela peut aussi parfois être un mal de tête. Je voulais ajouter que l'équipe des outils de rouille gère également un projet appelé cross :https://github.com/rust-embedded/crossCela pourrait être une autre solution que vous souhaitez examiner
La distribution Rust ne fournit que des bibliothèques compilées pour le système hôte. Cependant, selon la page wiki d'Arch Linux sur Rust, vous pouvez copier les bibliothèques compilées à partir des packages Windows dans le répertoire de téléchargement (notez qu'il existe des packages i686 et x86-64) à l'endroit approprié sur votre système (dans /usr/lib/rustlib
ou /usr/local/lib/rustlib
, selon l'endroit où Rust est installé), installez mingw-w64-gcc et Wine et vous devriez pouvoir effectuer une compilation croisée.
Si vous utilisez Cargo, vous pouvez indiquer à Cargo où rechercher ar
et l'éditeur de liens en ajoutant ceci à ~/.cargo/config
(où $ARCH
est l'architecture que vous utilisez) :
[target.$ARCH-pc-windows-gnu]
linker = "/usr/bin/$ARCH-w64-mingw32-gcc"
ar = "/usr/$ARCH-w64-mingw32/bin/ar"
Remarque :les chemins exacts peuvent varier en fonction de votre distribution. Vérifiez la liste des fichiers du ou des packages mingw-w64 (GCC et binutils) dans votre distribution.
Ensuite, vous pouvez utiliser Cargo comme ceci :
$ # Build
$ cargo build --release --target "$ARCH-pc-windows-gnu"
$ # Run unit tests under wine
$ cargo test --target "$ARCH-pc-windows-gnu"
MISE À JOUR 2019-06-11
Cela échoue pour moi avec :
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
Peut-être que cela aidera https://github.com/rust-lang/rust/issues/44787
Compilation statique sdl2
Il existe une option pour compiler statiquement sdl mais cela n'a pas fonctionné pour moi.
De plus, le mélangeur n'est pas inclus lorsqu'il est utilisé avec l'ensemble.
Compilons de manière croisée des exemples du projet rust-sdl2 d'Ubuntu vers Windows x86_64
En ~/.cargo/config
[target.x86_64-pc-windows-gnu]
linker = "x86_64-w64-mingw32-gcc"
ar = "x86_64-w64-mingw32-gcc-ar"
Ensuite, lancez ceci :
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 .
Construire des exemples à la fois
cargo build --target=x86_64-pc-windows-gnu --verbose --examples
Ou arrêter après le premier échec :
echo; for i in examples/*; do [ $? -eq 0 ] && cargo build --target=x86_64-pc-windows-gnu --verbose --example $(basename $i .rs); done
Exécuter
cargo build
mettra les binaires en target/x86_64-pc-windows-gnu/debug/examples/
Copiez les fichiers nécessaires :
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/
Copiez ensuite le répertoire target/x86_64-pc-windows-gnu/debug/examples/
sur votre machine Windows et exécutez les fichiers exe.
Exécuter dans cmd.exe
Si vous voulez voir la sortie de la console lors de l'exécution des fichiers exe, vous pouvez les exécuter à partir de cmd.exe
.
Pour ouvrir cmd.exe
dans le répertoire courant dans l'explorateur de fichiers, faites un clic droit avec Maj sur un emplacement vide dans la fenêtre et choisissez Open command window here
.
Les backtraces avec mingw devraient fonctionner maintenant - sinon, utilisez msvc https://github.com/rust-lang/rust/pull/39234