Подтвердить что ты не робот

Кросс-компиляция приложения Rust с Linux на Windows

В основном я пытаюсь скомпилировать простейший код для Windows, пока я разрабатываю Linux.

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

Я нашел эти команды, выполнив поиск в Интернете:

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

К сожалению, никто из них не работает. Это дает мне ошибку о отсутствующем ящике std

$ 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

Есть ли способ скомпилировать код в Linux, который будет работать в Windows?

4b9b3361

Ответ 1

Распространение Rust предоставляет только компилированные библиотеки для хост-системы. Однако, согласно вики-странице Arch Linux на Rust, вы можете скопировать скомпилированные библиотеки из пакетов Windows в каталог download (обратите внимание, что есть пакеты i686 и x86-64) в соответствующем месте вашей системы (в /usr/lib/rustlib или /usr/local/lib/rustlib, в зависимости от того, где установлен Rust), установите mingw-w64-gcc и Wine, и вы должен быть способен перекрестно скомпилировать.

Если вы используете Cargo, вы можете сказать Cargo, где искать ar и компоновщик, добавив это в ~/.cargo/config (где $ARCH - используемая вами архитектура):

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

Примечание. Точные пути могут варьироваться в зависимости от вашего распределения. Проверьте список файлов для пакетов mingw-w64 (GCC и binutils) в вашем дистрибутиве.

Затем вы можете использовать Cargo следующим образом:

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

Ответ 2

ОБНОВЛЕНИЕ 2019-06-11

Это терпит неудачу для меня с:

     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

Может быть, это поможет https://github.com/rust-lang/rust/issues/44787

Статическая компиляция sdl2

Есть вариант статической компиляции SDL, но у меня это не сработало.

Также миксер не входит в комплект поставки.

Пусть кросс-компиляция примеров из проекта rust-sdl2 из Ubuntu в Windows x86_64

В ~/.cargo/config

[target.x86_64-pc-windows-gnu]
linker = "x86_64-w64-mingw32-gcc"
ar = "x86_64-w64-mingw32-gcc-ar"

Затем запустите это:

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 .

Создавайте примеры сразу

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

Или остановитесь после первого сбоя:

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

Бежать

cargo build поместит двоичные файлы в target/x86_64-pc-windows-gnu/debug/examples/

Скопируйте необходимые файлы:

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/

Затем скопируйте каталог target/x86_64-pc-windows-gnu/debug/examples/ на свой компьютер с Windows и запустите exe файлы.

Запустить в cmd.exe

Если вы хотите увидеть вывод консоли при запуске exe файлов, вы можете запустить их из cmd.exe.

Чтобы открыть cmd.exe в текущем каталоге в проводнике, щелкните правой кнопкой мыши по Shift на пустом месте в окне и выберите Open command window here.

Обратные следы с mingw должны теперь работать - если не использовать msvc https://github.com/rust-lang/rust/pull/39234

Ответ 3

Я имел успех на Debian (тестирование) без использования Mingw и Wine, просто следуя официальным инструкциям. Они выглядят страшно, но в итоге это не так больно.

Официальные инструкции также содержат информацию о том, как кросс-компилировать код C/C++. Мне это не нужно, так что это то, что я на самом деле не проверял.

Пара замечаний по отдельным пунктам в официальной инструкции. Номера соответствуют номерам в официальных инструкциях.

  1. Debian: sudo apt-get install lld
  2. Создайте символическую ссылку с именем lld-link для lld где-нибудь в вашем $ PATH. Пример: ln -s/usr/bin/lld local_bin/lld-link
  3. Я не кросс-компилирую C/C++, не использовал этот пункт лично.
  4. Это, наверное, самая раздражающая часть. Я установил Rust на коробку Windows через rustup и скопировал библиотеки из каталогов, указанных в официальных документах, на коробку Linux. Осторожно, иногда были имена библиотек в верхнем регистре, но lld хочет, чтобы все они были в нижнем регистре (Windows не является регистром -s, Linux -). Я использовал следующее, чтобы переименовать все файлы в текущем каталоге в нижний регистр:

    for f in 'find'; do mv -v "$f" "'echo $f | tr '[A-Z]' '[a-z]''"; done
    

    Лично мне нужны обе директории Kit и только один из VC dirs.

  5. Я не кросс-компилирую C/C++, не использовал этот пункт лично.
  6. Просто сделайте $LIB_ROOT в скрипте в конце этого поста, $LIB_ROOT на каталог lib из пункта 3.
  7. Обязательный
  8. Я не кросс-компилирую C/C++, не использовал этот пункт лично.
  9. В зависимости от целевой архитектуры, одно из следующего:
    • rustup target add i686-pc-windows-msvc
    • rustup target add x86_64-pc-windows-msvc

Для кросс-сборки я использую следующий простой скрипт (32-битная версия):

#!/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 "[email protected]"

Я использую сценарий так же, как я использовал бы cargo build

Надеюсь, это кому-нибудь поможет!