Avatar ·

Как собрать Rust-приложение под Windows на Linux? Кросс-компиляция с нуля

Всем привет! Я пишу небольшое CLI-приложение на Rust под Linux, но мне нужно, чтобы оно работало и на Windows. Проблема в том, что я не хочу переключаться на Windows только ради сборки — хочу скомпилировать exe-файл прямо из-под Ubuntu. Я добавил цель `x86_64-pc-windows-gnu` через `rustup target add`, но при попытке собрать `cargo build --target x86_64-pc-windows-gnu` получаю кучу ошибок линковки, вроде: ``` error: linking with `x86_64-w64-mingw32-gcc` failed: exit status: 1 | = note: /usr/bin/x86_64-w64-mingw32-ld: cannot find -ladvapi32 /usr/bin/x86_64-w64-mingw32-ld: cannot find -luserenv ``` Я читал, что нужен MinGW-w64, установил его через apt, но ошибки остаются. Также пробовал ставить `mingw-w64` — не помогло. Мой код простой: ```rust use std::process::Command; fn main() { let output = Command::new("cmd") .args(&["/C", "echo Hello from Windows!"]) .output() .expect("failed to execute process"); println!("{}", String::from_utf8_lossy(&output.stdout)); } ``` Подскажите, как правильно настроить кросс-компиляцию? Нужно ли что-то дополнительно конфигурировать в Cargo.toml? Заранее спасибо! <<>>

Пошаговое руководство по кросс-компиляции Rust из Linux в Windows

Ваша проблема типична: одной установки цели и MinGW недостаточно. Нужно правильно настроить линковщик и добавить недостающие библиотеки. Вот проверенный рабочий подход.

Шаг 1. Установка инструментов

Убедитесь, что у вас установлены все необходимые пакеты:

sudo apt update
sudo apt install -y mingw-w64 gcc-mingw-w64-x86-64

Это даст вам кросс-компилятор GCC для Windows на x86_64. Также установите цель Rust:

rustup target add x86_64-pc-windows-gnu

Шаг 2. Настройка Cargo (конфигурация линковщика)

Создайте или отредактируйте файл ~/.cargo/config.toml (или project/.cargo/config.toml для конкретного проекта):

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

Это указывает Cargo использовать правильный кросс-линковщик вместо системного gcc.

Шаг 3. Добавление библиотек Windows (решение ошибок линковки)

Ошибки вида cannot find -ladvapi32 означают, что линковщик не находит статические библиотеки Windows. Их нужно явно указать в Cargo.toml вашего проекта:

[target.x86_64-pc-windows-gnu.dependencies]
winapi = { version = "0.3", features = ["advapi32", "userenv", "winbase"] }

Или, если вы не используете winapi напрямую, можно добавить псевдо-зависимость в .cargo/config.toml:

[target.x86_64-pc-windows-gnu]
rustflags = ["-L", "/usr/x86_64-w64-mingw32/lib", "-ladvapi32", "-luserenv"]

Шаг 4. Сборка

Теперь запустите сборку:

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

Готовый exe-файл будет в target/x86_64-pc-windows-gnu/release/your_project.exe.

Важные замечания:

  • Если используете std::process::Command с cmd — на Windows это сработает, но учтите, что некоторые Unix-specific функции (например, fork) недоступны.
  • Для проверки можно запустить exe под Wine: wine target/.../your_project.exe (установите wine через apt).
  • Если проект использует C-зависимости (например, openssl), потребуется кросс-компиляция этих библиотек — это отдельная тема.

После этих шагов ваш код должен собраться без ошибок. Пример рабочего вывода под Wine:

$ wine target/x86_64-pc-windows-gnu/release/myapp.exe
Hello from Windows!
<<>>

Альтернативный подход: использование Docker образа

Если возиться с настройкой MinGW и библиотек не хочется, можно использовать готовый Docker-образ для кросс-компиляции Rust под Windows. Это особенно удобно для CI/CD или если вы не хотите засорять систему.

Пример Dockerfile:

FROM rustembedded/cross:x86_64-pc-windows-gnu

COPY . /project
WORKDIR /project

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

Соберите образ и запустите:

docker build -t rust-win-cross .
docker run --rm -v $(pwd)/target:/project/target rust-win-cross

Образ rustembedded/cross уже содержит все необходимые инструменты: MinGW, правильный линковщик и библиотеки. Вам не нужно вручную устанавливать пакеты или править конфиги.

Плюсы:

  • Изолированная среда — не влияет на основную систему.
  • Гарантированно работает "из коробки".
  • Легко интегрируется с GitHub Actions или GitLab CI.

Минусы:

  • Требует установки Docker (около 1-2 ГБ).
  • Сборка в контейнере может быть медленнее, чем нативной.

Этот метод подойдёт, если вы не хотите углубляться в детали настройки кросс-компилятора. Для разовой сборки — идеальный вариант.