Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Кросс-компиляция

Rust позволяет собирать бинарные файлы для операционных систем, отличных от той, которую вы сейчас используете. Это значит, что код можно писать в одной ОС, а собирать бинарники для совсем другой. Например, можно разрабатывать под Linux и собирать .exe-файлы, которые запускаются в Windows. Можно даже собирать под «голые» микроконтроллеры, такие как ESP32 или STM32. В этом разделе мы разберём, как это работает и что означают такие понятия, как target triple.

TL;DR

Для сборки под ESP32 нужно использовать target xtensa-esp32-none-elf.

cargo build --target xtensa-esp32-none-elf

Можно также задать target в .cargo/config.toml, чтобы не вводить его каждый раз.

Сборка для вашей системы

Допустим, мы работаем на компьютере с Linux. Когда вы выполняете обычную команду сборки, Rust компилирует код для текущей платформы, то есть в данном случае для Linux:

cargo build

Проверить, какой бинарный файл был создан, можно с помощью команды file:

file ./target/debug/std_to_no_std

Вывод будет примерно таким. Он говорит, что это 64-битный ELF-файл, динамически связанный и собранный под Linux.

./target/debug/std_to_no_std: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, Build...

Кросс-компиляция под Windows

Теперь допустим, что вы хотите собрать бинарный файл под Windows, не покидая свою машину с Linux. Вот тут и пригодится кросс-компиляция.

Сначала нужно сообщить Rust о целевой платформе. Делать это нужно только один раз:

rustup target add x86_64-pc-windows-gnu

Это добавляет поддержку генерации 64-битных бинарников для Windows с помощью GNU-тулчейна (MinGW).

Теперь соберите проект снова, на этот раз указав цель:

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

Вот и всё. Rust создаст Windows-файл .exe, хотя вы по-прежнему находитесь в Linux. Итоговый бинарник будет лежать в target/x86_64-pc-windows-gnu/debug/std_to_no_std.exe.

Тип файла можно проверить так:

file target/x86_64-pc-windows-gnu/debug/std_to_no_std.exe

Вывод будет примерно таким: 64-битный файл формата PE32+ для Windows.

target/x86_64-pc-windows-gnu/debug/std_to_no_std.exe: PE32+ executable (console) x86-64, for MS Windows

Что такое target triple?

Что же означает строка x86_64-pc-windows-gnu?

Это называется target triple («тройка» цели), и она точно сообщает компилятору, какой результат вам нужен. Обычно она имеет такой формат:

`<architecture>-<vendor>-<os>-<abi>`

Но шаблон не всегда соблюдается. Иногда часть ABI отсутствует. В других случаях может отсутствовать и вендор, или и вендор, и ABI. Структура бывает запутанной, и исключений хватает. Если хотите глубже разобраться во всех нюансах, посмотрите статью «What the Hell Is a Target Triple?» из списка ссылок ниже.

Разберём, что на самом деле означает этот target triple:

  • Архитектура (x86_64): 64-битная x86, то есть тип процессора, который используется в большинстве современных ПК. Её также называют AMD64 или x64.

  • Вендор (pc): по сути, это заглушка. В большинстве случаев он не очень важен. Для macOS вендором будет apple.

  • ОС (windows): сообщает Rust, что мы хотим собрать программу для Windows.

  • ABI (gnu): эта часть указывает Rust использовать GNU-тулчейн для сборки бинарника.

Ссылки