GNU/Linux >> Tutoriales Linux >  >> Linux

Compile de forma cruzada una aplicación Rust de Linux a Windows

Otras respuestas, aunque técnicamente correctas, son más difíciles de lo que deberían ser. No hay necesidad de usar rustc (de hecho, no se recomienda, solo use cargo ), solo necesitas rustup , cargo y el mingw-w64 de su distribución.

Agregue el objetivo (también puede cambiar esto para cualquier objetivo para el que esté compilando de forma cruzada):

rustup target add x86_64-pc-windows-gnu

Puedes construir tu caja fácilmente con:

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

No hay necesidad de perder el tiempo con ~/.cargo/config o cualquier otra cosa.

EDITAR:solo quería agregar que, si bien puede usar lo anterior, a veces también puede ser un dolor de cabeza. Quería agregar que el equipo de herramientas de óxido también mantiene un proyecto llamado cruz:https://github.com/rust-embedded/crossEsta podría ser otra solución que desee analizar


La distribución de Rust solo proporciona bibliotecas compiladas para el sistema host. Sin embargo, según la página wiki de Arch Linux en Rust, puede copiar las bibliotecas compiladas de los paquetes de Windows en el directorio de descarga (tenga en cuenta que hay paquetes i686 y x86-64) en el lugar apropiado de su sistema (en /usr/lib/rustlib o /usr/local/lib/rustlib , dependiendo de dónde esté instalado Rust), instale mingw-w64-gcc y Wine y podrá realizar la compilación cruzada.

Si está utilizando Cargo, puede decirle a Cargo dónde buscar ar y el enlazador agregando esto a ~/.cargo/config (donde $ARCH es la arquitectura que usas):

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

Nota:las rutas exactas pueden variar según su distribución. Consulte la lista de archivos para los paquetes mingw-w64 (GCC y binutils) en su distribución.

Entonces puedes usar Cargo así:

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

ACTUALIZAR 2019-06-11

Esto falla para mí 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

Tal vez esto ayude https://github.com/rust-lang/rust/issues/44787

Compilación estática sdl2

Hay una opción para compilar estáticamente sdl pero no funcionó para mí.

Además, el mezclador no está incluido cuando se usa con el paquete.

Vamos a realizar una compilación cruzada del proyecto rust-sdl2 de Ubuntu a 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"

Luego ejecuta esto:

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 .

Cree ejemplos a la vez

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

O detenerse después del primer error:

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

Corre

cargo build pondrá binarios en target/x86_64-pc-windows-gnu/debug/examples/

Copie los archivos necesarios:

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/

Luego copie el directorio target/x86_64-pc-windows-gnu/debug/examples/ a su máquina con Windows y ejecute archivos exe.

Ejecutar en cmd.exe

Si desea ver la salida de la consola al ejecutar archivos exe, puede ejecutarlos desde cmd.exe .

Para abrir cmd.exe en el directorio actual en el explorador de archivos, haga clic derecho con shift en un lugar vacío en la ventana y elija Open command window here .

Los backtraces con mingw deberían funcionar ahora; si no, use msvc https://github.com/rust-lang/rust/pull/39234


Linux
  1. Cómo usar un escritorio remoto desde Windows a un escritorio Linux usando XRDP

  2. Conéctese a Linux desde Windows usando PuTTY

  3. ¿Cómo puedo ejecutar una aplicación OpenGL instalada en una máquina Linux desde mi máquina Windows?

  4. Uso de DLL de Windows desde Linux

  5. Apague la máquina de Windows desde la terminal de Linux

6 características que Windows 10 ha tomado de Linux

Cambiar de Windows a Linux

Cómo acceder a las particiones de Linux desde Windows 10

Pasar de Windows a Linux - Administración de discos

Cómo instalar software de Windows en Linux con Bottles

Cómo SSH en su servidor Linux desde Windows