GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Querkompilieren Sie eine Rust-Anwendung von Linux nach Windows

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


Linux
  1. Verbinden Sie sich von Windows aus mit PuTTY mit Linux

  2. Starten Sie Software-Installer unter Linux von Windows mit Cygwin

  3. Wie kann ich eine auf einem Linux-Rechner installierte OpenGL-Anwendung von meinem Windows-Rechner aus ausführen?

  4. pscp kopiert die Datei remote von Windows nach Linux

  5. Klonen Sie die Windows-Partition von Linux

6 Funktionen, die Windows 10 von Linux übernommen hat

Umstieg von Windows auf Linux

So greifen Sie von Windows 10 auf Linux-Partitionen zu

Umstieg von Windows auf Linux – Datenträgerverwaltung

So installieren Sie Windows-Software unter Linux mit Bottles

Wie Sie von Windows aus SSH in Ihren Linux-Server einbinden