Перейти к содержанию

Кросс-компилятор⚓︎

Кросс-компилятор (англ. cross compiler) - компилятор, производящий исполняемый код для платформы, отличной от той, на которой исполняется сам кросс-компилятор. Такой инструмент бывает полезен, когда нужно получить код для платформы, экземпляров которой нет в наличии, или в случаях когда компиляция на целевой платформе невозможна или нецелесообразна (например, это касается мобильных систем или микроконтроллеров с минимальным объёмом памяти). Например, компилятор, который работает на компьютере Windows 7, но и генерирует код, который работает на Android.

Применение кросс-компиляторов⚓︎

  • Встроенные компьютеры, на которых ресурсы устройства крайне ограничены.
  • Компиляция для нескольких машин. Например, компания может пожелать поддерживать несколько разных версий операционной системы или поддерживать несколько разных операционных систем. Используя кросс-компилятор, можно настроить единую среду сборки для компиляции для каждой из этих целей.
  • Компиляции на ферме серверов. Подобно компиляции для нескольких машин, сложная сборка, которая включает в себя множество операций компиляции, может быть выполнена на любой свободной машине.
  • Самонастройка на новую платформу. При разработке программного обеспечения для новой платформы или эмулятора будущей платформы используется кросс-компилятор, чтобы скомпилировать необходимые инструменты.
  • Компиляция машинного кода для эмуляторов для уже устаревших платформ, таких как Commodore 64 или Apple II.

Канадский крест⚓︎

Канадский крест - это техника построения кросс-компиляторов для других машин. Система конфигурирования и сборки GNU позволяет собирать программы, которые запускаются на системе, отличной от той, на которой собирались необходимые средства. Иными словами, она поддерживает сборку программ с помощью кросс-компилятора.

При использовании канадского креста c GCC могут быть четыре вида:

  • Фирменный родной компилятор для машины (1) (например, компилятор из Visual Studio) используется для построения собственного компилятора GCC для машины (2).
  • Родной компилятор GCC для машины (2) используется для сборки кросс-компилятора GCC с компьютера А на компьютер Б (3)
  • GCC кросс-компилятор с компьютера A на компьютер Б (3) используется для построения компилятора GCC кросс-компилятор из машины в машину C (4)

Схема

Конечный кросс-компилятор (4) не сможет работать на машине сборки A; вместо этого он будет работать на машине B, чтобы скомпилировать приложение в исполняемый код, который затем будет скопирован на машину C и выполнен на машине C.

Термин «канадский крест» возник потому, что в то время, когда эти проблемы обсуждались, в Канаде было три национальные политические партии.

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

GCC, коллекция свободно распространяемых компиляторов, может быть настроена для кросс-компиляции. Она поддерживает множество платформ и языков.

Для кросс-компиляции с GCC необходимо, чтобы была доступна скомпилированная для целевой платформы версия binutils. Особенно важно наличие GNU Assembler. Поэтому binutils должны быть предварительно скомпилированы с ключом --target=some-target, указанным скрипту конфигурирования (англ.). GCC также должна быть указана опция --target с аналогичным содержанием. После этого, чтобы GCC могла использовать полученные binutils, надо поместить путь к ним в переменную окружения path, например:

PATH=/path/to/binutils/bin:${PATH} make

Кросс-компиляция GCC требует, чтобы часть стандартной библиотеки целевой платформы была доступна на хост-платформе. Программист может решить скомпилировать полную библиотеку C, но этот выбор может быть ненадежным. Альтернативой является использование файла, который представляет собой небольшую библиотеку C, содержащий только самые важные компоненты, необходимые для компиляции исходного кода C.

К началу