Что было бы призрачным примером вариантов sysroot и prefix для Qt

Я просматриваю все параметры, которые могут быть запущены для configure script с Qt. (в частности, qt-везде-opensource-src-5.2.0).

После значительного поиска я решил, что этот материал плохо документирован в лучшем случае, поэтому я надеялся, что смогу помочь. Когда я смотрю описания опций конфигурации prefix и sysroot:

~/qt-везде-opensource-src-5.2.0 $./configure -help | grep "sysroot"
    -extprefix <dir>... Когда используется -sysroot, установите все в <dir>,
    -sysroot <dir>...... Устанавливает <dir> в качестве целевого компилятора и qmake sysroot, а также устанавливает пути pkg-config.
    -no-gcc-sysroot..... При использовании -sysroot он отключает передачу --sysroot в компилятор

~/qt-везде-opensource-src-5.2.0 $./configure -help | grep "prefix"
    -prefix <dir>...... Это установит все относительно <dir>
    -extprefix <dir>... Когда используется -sysroot, установите все в <dir>,
    -hostprefix [dir].. Инструменты и библиотеки, необходимые при разработке

Итак, я использовал -prefix раньше, и он сделал точно так, как описано. Он разместил все на предоставленном <dir>, затем, когда я построил свое приложение с помощью <prefix_dir>/bin/qmake и установил его на моей целевой платформе, он захотел найти все библиотеки общих объектов в <prefix_dir>/lib.

У меня под впечатлением, что если я использую -sysroot, он установит все в <sysroot_dir>, а затем, установив приложение на целевую платформу, он будет искать в /lib. По крайней мере, я надеюсь, что это правда.

Теперь, если мое предположение верно... то какая точка -extprefix? Они говорят, что если я могу перенаправить туда, где все хорошо, если я использую как -sysroot, так и -extprefix?

И для чего я хотел бы использовать -no-gcc-sysroot? Если бы я хотел, чтобы мои Qt-библиотеки были установлены на "sysroot", почему я не хочу, чтобы gcc использовал/знал один и тот же sysroot?

Объяснение некоторых из них было бы замечательным, даже лучше, если я смогу получить некоторые практические примеры того, как правильно использовать эти параметры.

Ответ 1

Это параметры, которые используются при создании встроенных платформ. Да, это королевский беспорядок. Итак, вот только частичный ответ:

-prefix

  • проверенный способ сказать /usr/lib вместо/usr/local/lib или аналогичный для всей установки Qt
  • когда Qt построен для платформы, на которой он в настоящее время работает (типичный для рабочего стола)

-sysroot/path

  • намеревается построить Qt для системы, которая не установлена ​​на/
  • например -sysroot ~/mysystem где ~/myssytem содержит /lib/bin и т.д.
  • передаст --sysroot другим инструментам, таким как gcc и pkg-config, поэтому они будут искать свои зависимости в ~/mysystem/lib, а не /lib

-extprefix/b

  • при использовании -sysroot/a, на самом деле не пишите в /a
  • напишите qt в /b вместо
  • это предназначено для кросс-компиляции с использованием только для чтения sysroots

-по-НКУ-SYSROOT

  • очень специфический взлом для компиляторов, которые не могут найти свой собственный crt внутри --sysroot
  • передает sysroot в pkgconfig и другие, но не gcc
  • так что gcc будет вызван с -L/sysroot/lib/правильно, но не пытается найти здесь неявные пути (crt).

-hostprefix/path

  • при компиляции для другой цели, чем мы в настоящее время выполняем
  • qmake будет главной архитектурой (например, x86), а сама qt будет целевой архитектурой (скажем, рука).
  • то поставьте qmake в /path вместо целевой системы, заданной -sysroot. он не будет полезен в целевой системе.

Чтобы добавить к путанице:

-R/путь

  • задает путь компоновщика ссылок - вот где QtGui находит QtCore, например, независимо от всех других опций.

Какие флаги, которые вы хотите использовать при компиляции для цели, а не вашего хоста, зависят от загрузки жестко запрограммированных допущений внутри configure.

Обычно -sysroot plus -prefix должен работать для большинства случаев использования.

то есть. когда у вас есть:

 $ ls ~/mytarget
 lib bin share dev

вы можете просто использовать -sysroot ~/mytarget -prefix/

Ответ 2

Одним из практических примеров может быть кросс-компиляция Qt для малины Pi, а затем создание набора "сестра" для добавления в Qt Creator.

Следующая команда устанавливает Qt на Pi после установки корневой файловой системы Pi:

    ./configure -opengl es2 -device linux-rasp-pi-g++ -device-option CROSS_COMPILE=$RPI_TOOLCHAIN -sysroot $RPI_SYSROOT -opensource -confirm-license -optimized-qmake -reduce-exports -release -make libs -prefix /usr/local/qt-5.5.1-pi -skip qtwebkit

Следующая команда затем устанавливает двоичные файлы на рабочем столе с помощью корневой файловой системы Pi.

    ./configure -opengl es2 -device linux-rasp-pi-g++ -device-option CROSS_COMPILE=$RPI_TOOLCHAIN -sysroot $RPI_SYSROOT -opensource -confirm-license -optimized-qmake -reduce-exports -release -make libs -extprefix /usr/local/qt-5.5.1-pi -skip qtwebkit

Обратите внимание, что единственное различие заключается в использовании -extprefix вместо -prefix, который направляет местоположение установки.

Примечание. Вы можете установить Qt на хост и цель одновременно, указав оба префикса и extprefix в той же строке

Теперь вы можете добавить этот комплект в свой Qt Creator, указав свой путь qmake, устройство, компилятор, отладчик и sysroot. Таким образом, вы можете создать проект qt на своем рабочем столе, а затем создать и запустить либо на рабочем столе, либо на pi в зависимости от выбранного вами набора.