script ./configure
принимает 3 опции --build
, --host
и --target
. Я запутываю их роли. Какая разница и семантика?
Какая разница в опции "./configure" "--build", "--host" и "--target"?
Ответ 1
Как отмечено в этом сообщении в блоге и упоминается в GCC Configure Terms, --target
применяется только при компиляции инструментальных цепей. Когда вы выполняете обычную кросс-компиляцию библиотеки или бинарного файла, вы используете
--build=the architecture of the build machine
--host=the architecture that you want the file to run on
Однако, когда вы строите инструментальные цепочки, все может усложниться. Я думаю, что следующее правильно (хотя я не могу сказать, что когда-либо вручную скомпилировал кросс-отладчик):
Предположим, что у вас есть:
- машина сборки powerpc, которую вы собираетесь делать на компиляции
- несколько встроенных устройств с процессорами mips, которые ваш код будет запущен на
- ноутбук x86, который вы собираетесь использовать для отладки этих устройств в поле
Вы настроили и построили сервер отладки (например, gdbserver) для запуска на встроенном устройстве с помощью
./configure --build=powerpc --host=mips
чтобы вы могли замаскировать ваше встроенное устройство и запустить "gdbserver: 1234 a.out", чтобы начать отладку и прослушивать порт 1234.
Затем вы создадите свой клиент для отладки (который подключается и управляет gdbserver) с помощью
./configure --build=powerpc --host=i686 --target=mips
который вы копируете на свой ноутбук x86, чтобы в поле вы могли запустить "gdbclient embedded.device: 1234", чтобы отладить вашу программу a.out.
Все это относится и к компиляторам, для которых вы можете посмотреть ссылку GCC выше или этот раздел о эта страница руководства Autoconf, целевые значения по умолчанию для хоста, хоста для сборки и сборки для результата config.guess. "
Словом, постройте код на --build
, запустите его на --host
с --target
архитектурной средой.
Ответ 2
Примечание. Аргумент --target
имеет смысл только при создании компилятора (например, GCC). При запуске configure
перед созданием GCC:
-
--build
: машина, на которой вы строите -
--host
: машина, которую вы создаете для -
--target
: машина, которая GCC будет генерировать двоичный файл для
Из документации GCC (Указания по установке узла/цели):
Если build, host и target все одинаковы, это называется native. Если сборка и хост одинаковы, но цель отличается, это называется крестом. Если сборка, хост и цель все разные, это называется канадцем (по темным причинам, связанным с политической партией Канады и фон человека, работающего над сборкой в то время). Если хост и цель одинаковы, но сборка отличается, вы используете кросс-компилятор для создания родного для другой системы. Некоторые люди называют это host-x-host, скрещенными родными или перекрестными. Если сборка и цель одинаковы, но хост отличается, вы используете кросс-компилятор для создания кросс-компилятора, который создает код для машины, на которой вы строите. Это редко, поэтому нет простого способа описать его. Есть предложение назвать это перекрёстком.