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