web-dev-qa-db-fra.com

Compilation croisée d'une application Rust de Linux vers Windows

En gros, j'essaye de compiler le code le plus simple sous Windows pendant que je développe sous Linux.

fn main() {
    println!("Hello, and bye.")
}

J'ai trouvé ces commandes en cherchant sur Internet:

rustc --target=i686-w64-mingw32-gcc  main.rs
rustc --target=i686_pc_windows_gnu -C linker=i686-w64-mingw32-gcc  main.rs

Malheureusement, aucun d'entre eux ne fonctionne. Cela me donne une erreur à propos de la caisse std manquante

$ rustc --target=i686_pc_windows_gnu -C linker=i686-w64-mingw32-gcc  main.rs 

main.rs:1:1: 1:1 error: can't find crate for `std`
main.rs:1 fn main() {
          ^
error: aborting due to previous error

Existe-t-il un moyen de compiler du code sous Linux qui s'exécutera sous Windows?

26
Fedcomp

La distribution Rust fournit uniquement des bibliothèques compilées pour le système hôte. Cependant, selon la page wiki de Arch Linux sur Rust , vous pouvez copier les bibliothèques compilées des packages Windows dans le répertoire download (notez qu'il existe des packages i686 et x86-64) à l'emplacement approprié sur votre système (en /usr/lib/rustlib ou /usr/local/lib/rustlib, selon l’emplacement où Rust est installé), installez mingw-w64-gcc et Wine et vous devriez être en mesure de procéder à une compilation croisée.

Si vous utilisez Cargo, vous pouvez indiquer à Cargo où chercher 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 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"
24
Francis Gagné

J'ai eu du succès avec Debian (tests) sans utiliser Mingw et Wine en suivant simplement les instructions officielles . Ils ont l'air effrayant, mais à la fin, ça ne m'a pas fait trop mal.

Quelques remarques pour des points individuels dans les instructions officielles:

  1. Debian: Sudo apt-get install lld
  2. Faites un lien symbolique nommé lld-link à lldquelque part dans votre $ PATH. Exemple: ln -s /usr/bin/lld local_bin/lld-link
  3. Je n'ai pas besoin de compiler en C/C++, je n'ai pas d'expérience.
  4. C'est probablement la partie la plus agaçante. J'ai installé Rust sur un ordinateur Windows via Rustup et j'ai copié les bibliothèques des répertoires nommés dans la documentation officielle dans l'ordinateur Linux. Attention, il y avait parfois des noms de fichiers de bibliothèque en majuscules, mais lld les veut tous en minuscules (Windows ne respecte pas la casse, ni Linux). J'ai utilisé ce qui suit pour renommer tous les fichiers du répertoire actuel en minuscules:
for f in `find`; do mv -v "$f" "`echo $f | tr '[A-Z]' '[a-z]'`"; done

Personnellement, j'ai eu besoin des deux répertoires Kit et d'un seul des répertoires VC.

  1. Je n'ai pas besoin de compiler en C/C++, je n'ai pas d'expérience.
  2. Il suffit de faire $LIB_ROOT dans le script à la fin de ce post, pointez sur le répertoire lib à partir du point 4.
  3. Obligatoire
  4. Je n'ai pas besoin de compiler en C/C++, je n'ai pas d'expérience.
  5. En fonction de l’architecture cible, l’un des éléments suivants:
    • rustup target add i686-pc-windows-msvc
    • rustup target add x86_64-pc-windows-msvc

Pour la construction croisée elle-même, j'utilise le script simple suivant (version 32 bits):

#!/bin/sh
# "cargo build" for the 32-bit Windows MSVC architecture.

# Set this to proper directory
LIB_ROOT=~/opt/Rust-msvc

# The rest shouldn't need modifications
VS_LIBS="$LIB_ROOT/Microsoft Visual Studio 14.0/VC/lib/"
KIT_8_1_LIBS="$LIB_ROOT/Windows Kits/8.1/Lib/winv6.3/um/x86/"
KIT_10_LIBS="$LIB_ROOT/Windows Kits/10/Lib/10.0.10240.0/ucrt/x86/"
export LIB="$VS_LIBS;$KIT_8_1_LIBS;$KIT_10_LIBS"
cargo build --target=i686-pc-windows-msvc "$@"

J'utilise le script de la même façon que j'utilise cargo build

J'espère que ça aide quelqu'un!

0
Tomáš Dvořák