Andere Antworten sind zwar technisch korrekt, aber schwieriger als nötig. rustc
muss nicht verwendet werden (Tatsächlich wird davon abgeraten, verwenden Sie einfach cargo
), brauchen Sie nur rustup
, cargo
und mingw-w64 Ihrer Distribution.
Fügen Sie das Ziel hinzu (Sie können dies auch für das Ziel ändern, für das Sie crosskompilieren):
rustup target add x86_64-pc-windows-gnu
Sie können Ihre Kiste einfach bauen mit:
cargo build --target x86_64-pc-windows-gnu
Kein Herumspielen mit ~/.cargo/config
oder irgendetwas anderes.
BEARBEITEN:Ich wollte nur hinzufügen, dass Sie zwar das oben Genannte verwenden können, es aber manchmal auch Kopfschmerzen bereiten kann. Ich wollte hinzufügen, dass das Rust-Tools-Team auch ein Projekt namens cross unterhält:https://github.com/rust-embedded/crossThis könnte eine weitere Lösung sein, die Sie untersuchen möchten
Die Rust-Distribution stellt nur kompilierte Bibliotheken für das Hostsystem bereit. Laut der Wiki-Seite von Arch Linux zu Rust könnten Sie jedoch die kompilierten Bibliotheken aus den Windows-Paketen im Download-Verzeichnis (beachten Sie, dass es i686- und x86-64-Pakete gibt) an die entsprechende Stelle auf Ihrem System kopieren (in /usr/lib/rustlib
oder /usr/local/lib/rustlib
, je nachdem, wo Rust installiert ist), installieren Sie mingw-w64-gcc und Wine und Sie sollten cross-compilieren können.
Wenn Sie Cargo verwenden, können Sie Cargo mitteilen, wo es nach ar
suchen soll und den Linker, indem Sie dies zu ~/.cargo/config
hinzufügen (wobei $ARCH
ist die von Ihnen verwendete Architektur):
[target.$ARCH-pc-windows-gnu]
linker = "/usr/bin/$ARCH-w64-mingw32-gcc"
ar = "/usr/$ARCH-w64-mingw32/bin/ar"
Hinweis:Die genauen Pfade können je nach Distribution variieren. Überprüfen Sie die Liste der Dateien für das/die mingw-w64-Paket(e) (GCC und binutils) in Ihrer Distribution.
Dann können Sie Cargo so verwenden:
$ # Build
$ cargo build --release --target "$ARCH-pc-windows-gnu"
$ # Run unit tests under wine
$ cargo test --target "$ARCH-pc-windows-gnu"
AKTUALISIEREN 11.06.2019
Das schlägt bei mir fehl mit:
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
Vielleicht hilft das https://github.com/rust-lang/rust/issues/44787
Statische Kompilierung von sdl2
Es gibt eine Option zum statischen Kompilieren von SDL, aber es hat bei mir nicht funktioniert.
Auch der Mixer ist nicht enthalten, wenn er mit dem Bundle verwendet wird.
Lassen Sie uns Beispiele aus dem rust-sdl2-Projekt von Ubuntu nach Windows x86_64 übergreifend kompilieren
In ~/.cargo/config
[target.x86_64-pc-windows-gnu]
linker = "x86_64-w64-mingw32-gcc"
ar = "x86_64-w64-mingw32-gcc-ar"
Führen Sie dann Folgendes aus:
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 .
Erstellen Sie sofort Beispiele
cargo build --target=x86_64-pc-windows-gnu --verbose --examples
Oder nach dem ersten Fehler stoppen:
echo; for i in examples/*; do [ $? -eq 0 ] && cargo build --target=x86_64-pc-windows-gnu --verbose --example $(basename $i .rs); done
Laufen
cargo build
wird Binärdateien in target/x86_64-pc-windows-gnu/debug/examples/
einfügen
Benötigte Dateien kopieren:
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/
Kopieren Sie dann das Verzeichnis target/x86_64-pc-windows-gnu/debug/examples/
auf Ihren Windows-Rechner und führen Sie exe-Dateien aus.
cmd.exe ausführen
Wenn Sie beim Ausführen von exe-Dateien die Konsolenausgabe sehen möchten, können Sie sie von cmd.exe
ausführen .
Um cmd.exe
zu öffnen im aktuellen Verzeichnis im Dateiexplorer, Rechtsklick mit Umschalttaste auf leere Stelle im Fenster und Open command window here
wählen .
Backtraces mit mingw sollten jetzt funktionieren - wenn nicht msvc https://github.com/rust-lang/rust/pull/39234 verwenden