GNU/Linux >> Tutoriels Linux >  >> Linux

Cross-compiler une application Rust de Linux vers Windows

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


Linux
  1. Comment effectuer un bureau à distance de Windows vers un bureau Linux à l'aide de XRDP

  2. Connectez-vous à Linux à partir de Windows en utilisant PuTTY

  3. Lancer des programmes d'installation de logiciels sur Linux à partir de Windows à l'aide de Cygwin

  4. Comment puis-je exécuter une application OpenGL installée sur une machine Linux à partir de ma machine Windows ?

  5. RDP de Linux à Windows

6 fonctionnalités que Windows 10 a tirées de Linux

Passer de Windows à Linux

Comment accéder aux partitions Linux à partir de Windows 10

Passer de Windows à Linux - Gestion des disques

Comment installer un logiciel Windows sur Linux avec Bottles

Comment se connecter en SSH à votre serveur Linux à partir de Windows