Как собрать Rust-приложение под Windows на Linux? Кросс-компиляция с нуля
Пошаговое руководство по кросс-компиляции 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 ГБ).
- Сборка в контейнере может быть медленнее, чем нативной.
Этот метод подойдёт, если вы не хотите углубляться в детали настройки кросс-компилятора. Для разовой сборки — идеальный вариант.
Ответов пока нет.
Войдите чтобы оставить ответ