Как скомпилировать ветку разработки Qt5 из репозитория git для Raspberry Pi?

В сети есть несколько руководств, объясняющих, как скомпилировать Qt5 для Raspberry Pi. К сожалению, все они немного устарели. Обычно для некоторых функций GLIBC получаются «неопределенные ссылки». Этот вопрос и ответ объясняют, как создать современный (март 2015 г.) кросс-компилятор gcc: Как создать современную цепочку инструментов кросс-компиляции для Raspberry Pi 1?

И этот вопрос и ответ объясняют, что нужно сделать, чтобы подготовить сам Raspbian к использованию этим компилятором: Как мне подготовить Raspberry Pi с Raspbian, чтобы я мог кросс-компилировать программы Qt5 с хоста Linux?

Но как компилируется сам Qt5?


person Greenflow    schedule 11.05.2015    source источник


Ответы (1)


Чтобы создать Qt5 для Raspberry Pi, необходимо выполнить несколько шагов:

Получите исходники Qt5 с git. Чтобы проверить Qt5:

git clone http://code.qt.io/cgit/qt/qt5.git< /а>

or

git clone http://code.qt.io/qt/qt5.git

Репозиторий может время от времени меняться. Проект qt все еще развивается.

Приведенная выше команда выполняется на хосте Linux. Чтобы получить ветку dev cd для qt5 и:

git checkout разработчик

с последующим

./initRepository

Это займет довольно много времени. За это время можно смонтировать корневую папку Raspberry Pi. Можно использовать кард-ридер и установить SD-карту. Гораздо лучшим решением является использование nfs, samba, sshfs для монтирования жизни Raspberry Pi. Таким образом, мелкие ошибки, например. отсутствующие пакеты разработки легко исправляются «на лету».

Я использую sshfs:

sshfs pi@raspberrypi://дом/я/рашпиль

Если это монтирование прошло успешно, корневая файловая система Raspberry Pi будет доступна в /home/me/rasp.

Как только Qt5 извлечен, необходимо внести следующие изменения: В qt5/qtbase/mkspecs необходимо отредактировать (или скопировать и отредактировать) файл linux-arm-gnueabi-g++.

MAKEFILE_GENERATOR      = UNIX
CONFIG                 += incremental

QMAKE_INCREMENTAL_STYLE = sublib

include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)

# modifications to g++.conf
QMAKE_CC                = <path to>/arm-linux-gnueabihf-gcc
QMAKE_CXX               = <path to>/arm-linux-gnueabihf-g++
QMAKE_LINK              = <path to>/arm-linux-gnueabihf-g++
QMAKE_LINK_SHLIB        = <path to>/arm-linux-gnueabihf-g++

# modifications to linux.conf
QMAKE_AR                = <path to>/arm-linux-gnueabihf-ar cqs
QMAKE_OBJCOPY           = <path to>/arm-linux-gnueabihf-objcopy
QMAKE_NM                = <path to>/arm-linux-gnueabihf-nm -P
QMAKE_STRIP             = <path to>/arm-linux-gnueabihf-strip


QMAKE_INCDIR_EGL        = $$[QT_SYSROOT]/opt/vc/include/EGL/
QMAKE_INCDIR_OPENGL_ES2 = $$[QT_SYSROOT]/opt/vc/include/GLES2/
QMAKE_INCDIR_OPENVG     = $$[QT_SYSROOT]/opt/vc/include/VG/  

QMAKE_LIBDIR_EGL        = $$[QT_SYSROOT]/opt/vc/lib/
QMAKE_LIBDIR_OPENGL_ES2 = $$[QT_SYSROOT]/opt/vc/lib/
QMAKE_LIBDIR_OPENVG     = $$[QT_SYSROOT]/opt/vc/lib/

QMAKE_LIBS_EGL          = -lEGL -lGLESv2                       
QMAKE_LIBS_OPENVG       = -lOpenVG -lEGL -lGLESv2         
QMAKE_LIBS_OPENGL_ES2   = -lEGL -lGLESv2

LIBS  += -L$$[QT_SYSROOT]/opt/vc/lib -lvcos -lbcm_host -lvchiq_arm 
LIBS  += -lEGL -lGLESv2 

INCLUDEPATH  += $$[QT_SYSROOT]/opt/vc/include 
INCLUDEPATH  += $$[QT_SYSROOT]/opt/vc/include/interface/vcos 

INCLUDEPATH  += $$[QT_SYSROOT]/opt/vc/include/interface/vcos/pthreads 
INCLUDEPATH  += $$[QT_SYSROOT]/opt/vc/include/interface/vmcs_host/linux

‹путь к› должен быть заменен кросс-компилятором, который был создан в соответствии с: Как создать современную цепочку инструментов кросс-компиляции для Raspberry Pi 1?

Следующим шагом является настройка Qt5:

   ./configure -opengl es2 -device linux-rasp-pi-g++ -device-option CROSS_COMPILE=<path to>/arm-linux-gnueabihf- -xplatform linux-arm-gnueabi-g++ -sysroot /home/me/rasp -opensource -confirm-license -optimized-qmake  -release -make libs -prefix /usr/local/qt5pi -v -libinput -linuxfb -directfb -xcb  -fontconfig -ts
   lib -evdev -iconv -xinput2 -xkbcommon-evdev -eglfs -icu -qt-pcre -lpthread  -system-sqlite -no-sql-sqlite2 -gstreamer 1.0 -reduce-exports

Особого внимания требуют следующие параметры:

  1. -xplatform linux-arm-gnueabi-g++ Это mkspec. Измените имя соответствующим образом, если linux-arm-gnueabi-g++ не редактировался, а был создан новый mkspec.

  2. -device-option CROSS_COMPILE=‹путь к›/arm-linux-gnueabihf- Не уверен, нужно ли это. Нашел в некоторых учебниках. Без этой опции все работало нормально. Настройте ‹путь к› для кросс-компилятора так же, как в файле mkspec.

  3. -sysroot /home/me/rasp Очень важно. Точка монтирования, в которой монтируется Raspberry Pi.

  4. -prefix /usr/local/qt5pi Где Qt5 должен быть установлен на RPi

Теперь осталось сделать обычное: make/make install. Команда собирает Qt5 и устанавливает его в /usr/qt5pi на Raspberry Pi. Убедитесь, что для этого расположения существуют надлежащие разрешения на запись.

Еще кое-что:

qtwayland/src/hardwareintegration/client/brcm-egl/qwaylandbrcmeglintegration.h

содержал ошибку, когда я компилировал свой qt5. Быстрое исправление - отредактировать этот файл:

#include <QtWaylandClient/private/qwaylandclientbufferintegration_p.h>

#include <wayland-client.h> <--- add this below the #include above.

И последнее: этот qt5 НЕ подходит для использования внутри самого Raspberry Pi. При создании программ RPi должен быть смонтирован, а компиляция должна выполняться на том же хосте с тем же кросс-компилятором, на котором был скомпилирован Qt5.

И последнее: RPi не поддерживает xcb. Таким образом, переадресация X11 невозможна.

EDIT: мне сказали, что это неправда. Нет, это не так. Однако, что правда, RPi не поддерживает xcb/X11 для программ, использующих OpenGL. Так что никаких программ qtquick 2: http://lists.qt-project.org/pipermail/qtonpi/2012-October/001087.html

На данный момент с этим ничего не поделаешь, графический драйвер просто не поддерживает это. Поддержка Wayland ограничена. Лучшей платформой для использования является eglfs.

person Greenflow    schedule 11.05.2015
comment
Руководство почти завершено, но кое-где содержит неверную информацию. - person peppe; 12.05.2015
comment
Нет абсолютно никакой необходимости изменять файл mkspecs. Те, что поставляются с 5.3+, просто прекрасны. Просто убедитесь, что передали правильные пути компилятора в -device-option. - person peppe; 12.05.2015
comment
Компилировать ВЕСЬ Qt может быть излишним, но можно просто скомпилировать нужные модули. - person peppe; 12.05.2015
comment
X11 работает на RPi, так почему же говорить, что это не так? Обратите внимание, как ваша командная строка configure запрашивает поддержку XCB. - person peppe; 12.05.2015
comment
Ваш трюк с sshfs (отсутствие надлежащего sysroot) хорош, но 1) он сильно замедлит компиляцию. Вам также нужны фиктивные шифры, чтобы избежать перегрузки процессора RPi. Кроме того, добавьте к нему ограниченную пропускную способность сети. 2) требуется transform_symlinks или любая абсолютная символическая ссылка на RPi будет указывать на несуществующие файлы на вашем хосте. - person peppe; 12.05.2015
comment
@pepe, это то, что сработало для меня. И mkspecs не подходят для Raspberry Pi. Как видите, я добавил в файл mkspec всевозможные переменные LIBS и QMAKE. Я также добавил правильный -device-option... не работал. Мой компилятор не нашелся без хака в этом mkspec. Я не говорю, что приведенный выше урок идеален. Обычно существует более одного возможного решения. Это более или менее результат нескольких дней испытаний, и на данный момент я ничего не путаю. - person Greenflow; 12.05.2015
comment
X11 работает на RPi, так почему же говорить, что это не так? И да, и нет. Вы правы, я должен перефразировать это. X11 работает на RPi, но во многих случаях абсолютно бесполезен. Не работает для программы, использующей OpenGL: lists.qt -project.org/pipermail/qtonpi/2012-October/001087.html Это означает: нет qtquick 2 на RPi с использованием X11. - person Greenflow; 12.05.2015
comment
transform_symlinks Я упоминал об этом в предыдущей части руководства: stackoverflow.com/questions/30120871 / Также: возможно, есть и другие способы справиться с этим, но я использую свой Qt5 на RPi уже довольно давно и пока не вижу никаких недостатков. - person Greenflow; 12.05.2015
comment
«sshfs» медленный... И да, и нет... Я все еще вижу людей, компилирующих qt5 на своих RPi, так как они не знают, как настроить среду кросс-компиляции. По сравнению с ними метод sshsf работает молниеносно. Мой qt5 был скомпилирован за 6 часов. Я читал о 38 часах при исходной компиляции на разогнанном RPi. - person Greenflow; 12.05.2015
comment
Кстати... такой учебник должен быть в стадии разработки. Если вы хотите улучшить его.... :-) Кстати 2... как вы думаете, nfs или samba быстрее, чем sshfs? Как я уже писал, теоретически вы можете просто установить SD-карту, но я предпочитаю, чтобы у меня была «жизнь» RPi, например. для быстрого исправления пути или отсутствующего пакета. - person Greenflow; 12.05.2015