raspberry pi
Home Qt Кросскомпиляция Qt 5.9 и Qt 5.12 для Raspberry Pi 1, Raspberry Pi 3 (B+)

Кросскомпиляция Qt 5.9 и Qt 5.12 для Raspberry Pi 1, Raspberry Pi 3 (B+)

by Pavelk
Published: Last Updated on raspberry pi

Пока в разгаре новогодние праздники захотелось попробовать в действии Raspberry Pi (Здесь для модели 3 B+, но так же подходит и для 1,2), а именно чего-нибудь для неё написать, хотя бы Hello World с помощью Qt. Ставить весь Qt на саму малинку как-то долго, да и пока на ней компилируется простейшая программа можно упиться в усмерть, поэтому будем настраивать кроссс-компиляцию, что бы всю разработку вести на своём пк (Ubuntu 16.10  x64).

Приступаем.

[tip]Обновлено для Qt 5.9.1 и Raspbian 2017-09-08 Stretch для Raspberry PI3 Model B[/tip] [tip]Обновлено для Qt 5.12.2 и Raspbian 2018-11-13 Stretch под Raspberry PI3 Model B+ [/tip]

1. Первым делом необходимо скачать образ ОС для малинки, это будет raspbian (можно и Lite (без X), тогда получится сделать «kiosk mode») и залить её на SD карточку, которая уже должна быть воткнута.

mkdir ~/Projects/RaspberryPI 
cd ~/Projects/RaspberryPI 
wget https://downloads.raspberrypi.org/raspbian_latest # Обычный
#Если нужен облёгчённый, бек иксов: wget https://downloads.raspberrypi.org/raspbian_lite_latest
unzip raspbian_latest  
#unzip raspbian_lite_latest
sudo dd if=2018-11-13-raspbian-stretch.img of=/dev/mmcblk0 bs=4M 
#sudo dd if=2018-11-13-raspbian-stretch-lite.img of=/dev/mmcblk0 bs=4M 
sync
[tip]Что бы узнать адрес флэшки, наберите lsblk[/tip]

Если так случалось, что нет картридера, то залить прошивку можно и на винде с помощью win32diskimager (запускать от рута)

2. Когда заливка завершиться, вытаскиваем СДшку и загружаем с неё малинку.

Теперь её немножко надо настроить, переходим Menu -> Preferences -> Raspberry Pi configuration. 
Либо в консольке(Menu->Accessories->Terminal) :

sudo raspi-config

Расширяем систему на весь объём флэшки: Advanced options->expand filesystem,
включаем ssh в Interfacing options,
подрубаемся к wifi, 
в Advanced options->GL Driver включаем GL (Full KMS) и перезагружаемся.

Вбиваем в консольке ifconfig, запоминаем айпишник, на этом пока что всё.

Кстати, о настройке WIFI raspbian из консоли (если без графического интерфейса, т.е. lite версия):

sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
#Дописываем:
network={
    ssid="The_ESSID_from_earlier"
    psk="Your_wifi_password"
}

#Выходим с сохранением и перезагружаемся:
sudo reboot

3. Приконнектимся к малинке по ssh, раскомментим получение исходников пакетов, установим нужные пакеты и создадим нужные папки

ssh pi@192.168.2.101 (пароль по дефолту "raspberry")
sudo nano /etc/apt/sources.list  #расскомментить строчку с deb-src
sudo apt-get update
sudo apt-get upgrade
sudo rpi-update #Обновим ядро и прочее основное
reboot
sudo apt-get install -y libudev-dev libinput-dev libts-dev libxcb-xinerama0-dev libxcb-xinerama0
sudo apt-get install -y libfontconfig1-dev libfreetype6-dev libx11-dev libxext-dev libxfixes-dev libxi-dev libxrender-dev libxcb1-dev libx11-xcb-dev libxcb-glx0-dev
sudo apt-get install -y libxcb1 libxcb1-dev libx11-xcb1 libx11-xcb-dev libxcb-keysyms1 libxcb-keysyms1-dev libxcb-image0 libxcb-image0-dev libxcb-shm0 libxcb-shm0-dev libxcb-icccm4 libxcb-icccm4-dev libxcb-sync1 libxcb-sync-dev libxcb-render-util0 libxcb-render-util0-dev libxcb-xfixes0-dev libxrender-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-glx0-dev libxcb-xinerama0-dev
sudo apt-get install -y build-essential libgl1-mesa-dev freeglut3 freeglut3-dev mesa-common-dev libglapi-mesa libosmesa6 mesa-utils
sudo apt-get install -y libwayland-egl1-mesa libraspberrypi-dev  freeglut3-dev freeglut3   libegl1-mesa libegl1-mesa-dev libegl1-mesa-drivers libepoxy-dev libepoxy0 libgbm-dev  libgbm1  libgegl-0.3-0  libgegl-dev libva-egl1 mesa-utils-extra
sudo apt-get install -y libraspberrypi0 libva-egl1 libegl1-mesa libegl1-mesa-drivers gegl 
sudo apt-get install -y libglfw3-dev libgles2-mesa-dev
sudo apt-get build-dep qt4-x11 #ради зависимостей
sudo apt-get build-dep libqt5gui5 #ради зависимостей
#Чувствую, большую половину из этого не надо, но я не знаю какую точно т.к. решал проблемы с OpenGL и прочичи либами
sudo mkdir /usr/local/qt5pi
sudo chmod -R 777 /usr/local/qt5pi

4. Так, возвращаемся к хосту, качаем тулчейн:

mkdir raspi
cd raspi
git clone https://github.com/raspberrypi/tools

5. Создаём sysroot и через rsync синхронизируем его с малиновым, что бы оттуда взять заголовочники, либы и компилятор

IP=192.168.2.101 # айпишник малинки
rsync -avz pi@$IP:/lib sysroot # опять идём пить кофе
rsync -avz pi@$IP:/usr/include sysroot/usr
rsync -avz pi@$IP:/usr/lib sysroot/usr # можно сходить просраться
rsync -avz pi@$IP:/opt/vc sysroot/opt

6. Дальше необходимо поправить символьные ссылки, что бы они были относительно нашей скопированной sysroot, для этого есть готовый скриптик, качаем и запускаем:

wget https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py
chmod +x sysroot-relativelinks.py
./sysroot-relativelinks.py sysroot

7. Теперь можно склонировать Qt, сконфигурировать и запустить на компиляцию

git clone git://code.qt.io/qt/qt5.git QtSources
cd QtSources
perl init-repository
git checkout 5.12 # Если нужно 5.9, то проверял с 5.9.1
git submodule update --recursive


BASEPATH=~/Projects/RaspberryPI/raspi # базовый путь, где все наши манипуляции происходят (без слэша на конце)
./configure -skip wayland -skip script -skip webengine -no-pch -no-kms -no-xcb -no-use-gold-linker -nomake tests -nomake examples -reduce-exports -eglfs  -release -opengl es2 -device linux-rasp-pi3-g++ -device-option CROSS_COMPILE=$BASEPATH/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf- -sysroot $BASEPATH/sysroot -opensource -confirm-license -make libs -prefix $BASEPATH/qt5pi -extprefix $BASEPATH/qt5pi -hostprefix $BASEPATH/qt5 -v
make -j4 # и поспим часик (4 - количество ядер проца, для ускорения)
make install

Чтиво по некоторым фичам: https://doc.qt.io/qt-5/embedded-linux.html, https://doc.qt.io/archives/qt-5.8/configure-options.html, https://doc.qt.io/qt-5/linux-requirements.html, https://doc.qt.io/archives/qt-4.8/configure-options.html

[tip]Если возникли ошибки при сборке и нужно переконфигурировать с другими параметрами, не забудьте удалить предыдущий результат, набрав «git clean -dxf»  и «make clean» иначе будет ещё хуже =) [/tip] [tip]Для Qt < 5.9.1 нужен -device linux-rpi3-g++[/tip] [tip]При конфигурации отключён QtWebKit! Для Qt < 5.10 нужно указывать «-skip webkit»     Кому нужен уберите «-skip webengine».  [/tip] [tip]Возможно, нужно так же указать -qt-xcb (и убрать -no-xcb), что бы нормально работали QWidgets, у меня же все приложения только с QML. Так же нужно указать  «-platform xcb»  если у вас gui версия (обычная, а не lite)[/tip] [warning]При ошибке с JavaScriptCore/wtf/Platform.h:370:6: error: #error «Not supported ARM architecture» добавьте к конфигурации «-skip script» или добавьте к make флаг:»make CFLAGS=»${CFLAGS}-D__ARM_ARCH_7M__»»  (взял из /3rdparty/javascriptcore/JavaScriptCore/wtf/Platform.h)[/warning] [warning]При ошибке с PCRE2: PCRE2_CODE_UNIT_WIDTH, LINK_SIZE и прочие мессаджы с ней связанные  (отвечает за регулярные выражения)  можно либо отключить ( в конфиге «-no-pcre»), но почему-то у меня не было такого параметра,
либо прописать все дефайны вручную: make CFLAGS=»${CFLAGS} -ldl -DPCRE2_CODE_UNIT_WIDTH=16 -DHAVE_INTTYPES_H=1 -DHAVE_MEMMOVE=1 -DHAVE_LIMITS_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STDINT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DLINK_SIZE=2 -DMATCH_LIMIT=10000000 -DMATCH_LIMIT_RECURSION=10000000 -DMAX_NAME_COUNT=10000 -DMAX_NAME_SIZE=32 -DNEWLINE_DEFAULT=2 -DPARENS_NEST_LIMIT=250 -DSUPPORT_UNICODE»  причина этому — почему-то не подключается файл config.h (Расположен qtbase/src/3rdparty/pcre2/src/config.h), где прописаны все эти дефайны. [/warning] [warning]При ошибке с zlib, можно её отключить -no-zlib (скорее всего каких-то либ на хосте нехватает, но т.к. мне было не важно, не стал разбираться, остальных проблем хватило)[/warning] [warning]При ошибке «ERROR: The OpenGL functionality tests failed!
You might need to modify the include and library search paths by editing QMAKE_INCDIR_OPENGL[_ES2],
QMAKE_LIBDIR_OPENGL[_ES2] and QMAKE_LIBS_OPENGL[_ES2] in the mkspec for your platform.» ИЛИ «In function `QEGLPlatformContext::getProcAddress(char const*)’:
qeglplatformcontext.cpp:(.text+0xa4): undefined reference to `dlsym'»  для Raspbian Stretch нужно подредактировать nano ./qtbase/mkspecs/devices/linux-rasp-pi3-g++/qmake.conf  и изменить названия либ «-lEGL» и «-lGLESv2» на «-lbrcmEGL» и «-lbrcmGLESv2» так как названия в /opt/vc/lib/ отличаются.

Возможно лучше будет использовать в -device «linux-rasp-pi3-vc4-g++»

Так же возможна проблема с тем, что  EGLFS Raspberry Pi ………………. no, в таком случае файлик нужно поправить, указав правильные пути.
Моя версия:
[spoiler]

include(../common/linux_device_pre.conf)

QMAKE_RPATHLINKDIR_POST += $$[QT_SYSROOT]/opt/vc/lib

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

QMAKE_INCDIR_EGL = $$[QT_SYSROOT]/opt/vc/include \
$$[QT_SYSROOT]/opt/vc/include/interface/vcos/pthreads \
$$[QT_SYSROOT]/opt/vc/include/interface/vmcs_host/linux
QMAKE_INCDIR_OPENGL_ES2 = $${QMAKE_INCDIR_EGL}
QMAKE_INCDIR_OPENVG = $${QMAKE_INCDIR_EGL}

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

QMAKE_INCDIR_BCM_HOST = $$[QT_SYSROOT]/opt/vc/include
QMAKE_LIBDIR_BCM_HOST = $$[QT_SYSROOT]/opt/vc/lib
QMAKE_LIBS_BCM_HOST = -lbcm_host

DISTRO_OPTS += deb-multi-arch
DISTRO_OPTS += hard-float

QMAKE_CFLAGS += -march=armv8-a -mtune=cortex-a53 -mfpu=crypto-neon-fp-armv8

QMAKE_CXXFLAGS = $$QMAKE_CFLAGS

EGLFS_DEVICE_INTEGRATION = eglfs_brcm

include(../common/linux_arm_device_post.conf)

load(qt_config)

[/spoiler] [/warning] [warning]В случае ошибки «error: invalid use of incomplete type ‘X509 {aka struct x509_st}’«, то это баг Qt: https://bugreports.qt.io/browse/QTBUG-52905. Исправления будут в версии 5.10, так что либо отключайте ssl при конфигурации: «-no-openssl» либо даунгрейдите openssl до 1.0[/warning]

8. Теперь закинем на малинку скомпилированные библиотеки и заголовочники Qt:

cd ../
rsync -avz qt5pi pi@$IP:/usr/local

9. Ну и можно собрать пример и закинуть на малинку:

cd QtSources/qtbase/examples/opengl/qopenglwidget
$BASEPATH/qt5/bin/qmake
make
scp qopenglwidget pi@$IP:/home/pi

10. На девайсе необходимо дать знать линковщику о наших либах, а так же создать qt.conf в папке, откуда будем запускать все Qt приложения:

ssh pi@192.168.2.101 (пароль по дефолту "raspberry")
echo /usr/local/qt5pi/lib | sudo tee /etc/ld.so.conf.d/00-qt5pi.conf
echo QT_PLUGIN_PATH=/usr/local/qt5pi/plugins/ | sudo tee -a /etc/environment
echo QT_QPA_FONTDIR=/usr/share/fonts/truetype/dejavu | sudo tee -a /etc/environment
printf "[Paths]\nPlugins=/usr/local/qt5pi/plugins\nQml2Imports=/usr/local/qt5pi/qml" | sudo tee ~/qt.conf
cd /usr/local/qt5pi/lib
sudo ldconfig
[warning]При проблеме «QFontDatabase: Cannot find font directory /home/pi/lib/fonts.
Note that Qt no longer ships fonts. Deploy some (from http://dejavu-fonts.org for example) or switch to fontconfig.»  нужно указать, где лежат шрифты, для этого добавим переменную окружения (выше уже добавлена) : «echo QT_QPA_FONTDIR=/usr/share/fonts/truetype/dejavu | sudo tee -a /etc/environment» видимо какую-то опцию забыл в конфиге добавить, наверное «-fontconfig«. [/warning]

Перезагружаем малинку.

11. Но запускать ещё рано, у rasbian по дефолту грузиться mesa драйвер и opengl пахать не будет по нормальному, поэтому заставим её использовать нужный:

[warning]Не факт! Сначала всё таки лучше попробовать запустить =)[/warning]
sudo rm /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0 /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0
sudo ln -s /opt/vc/lib/libEGL.so /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0
sudo ln -s /opt/vc/lib/libGLESv2.so /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0
sudo ln -s /opt/vc/lib/libEGL.so /opt/vc/lib/libEGL.so.1
sudo ln -s /opt/vc/lib/libGLESv2.so /opt/vc/lib/libGLESv2.so.2

Вот теперь наконец-то можно запустить пример! Он на малинке /home/pi/qopenglwidget

[tip] Если не запускается, в консольке прописываем

export QT_LOGGING_RULES=qt.qpa.*=true
./qopenglwidget

И гуглим ошибки.

Если совсем не запускается, то прописываем:

ldd ./qopenglwidget

И смотрим по правильному адресу ли лежат библиотеки и всех ли хватает. Потом гуглим на тему ldconfig.

Если будет в выводе:

* failed to add service - already in use?

То подправим файлик «sudo nano /boot/config.txt», убрав «dtoverlay=vc4-kms-v3d» (или закомментировать) и перезагрузиться.

Возможно, стоит при конфигурации указать «-device linux-rasp-pi3-vc4-g++» (при необходимости подправить названия библиотек).

[/tip]

12. С этим разобрались, теперь настроим QtCreator что бы можно было компилить и запускать на малинке в один клик:

12.1. Параметры->Устройства->Добавить
Обычное Linux-устройство
название на свой вкус и цвет
вводим айпишник, логин и пароль
завершить

12.2. Параметры->Сборка и запуск->Компиляторы->Добавить
GCC -> C++
Название: Raspberry PI3 GCC
Путь: /home/pavelk/Projects/RaspberryPI/raspi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-g++

12.3. Параметры->Сборка и запуск->Отладчики->Добавить
Название: Raspberry PI3 GDB
Путь: /home/pavelk/Projects/RaspberryPI/raspi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-gdb

12.4. Параметры->Сборка и запуск->Профили Qt->Добавить
Название: Qt 5.9.1 Raspberry PI3
Путь: /home/pavelk/Projects/RaspberryPI/qt5/bin/qmake

12.5. Параметры->Сборка и запуск->Комплекты->Добавить
Название: Raspberry PI3
Тип устройства: Обычное Linux-устройство
Устройство: выбираем добавленное из первого шага
Компилятор C++: Raspberry PI3 GCC
Отладчик: Raspberry PI3 GDB
Профиль Qt: Qt 5.9.1 Raspberry PI3

12.6. Нажимаем «Применить».

14. Создаём новый проект, в *.pro файл добавляем:

INSTALLS        = target
target.path     = /home/pi

Компилим и после завершения проект должен запуститься на малинке.

Вот как-то так в общем =)

P.S. Большая часть была взята с https://wiki.qt.io/RaspberryPi2EGLFS с моими небольшими правками — думал всё сложнее будет =)

47 комментариев

Олег 12 января 2022 - 18:03

Добрый день!
Спасибо за инструкцию!
Подскажите пожалуйста зачем в начале создаем директорию «sudo mkdir /usr/local/qt5pi»?
если потом при сборке мы указываем другую директорию «~/Projects/RaspberryPI/raspi/qt5pi»

Reply
Pavelk 13 января 2022 - 2:06

Здравствуйте. Пожалуйста. Одна на хосте другая на малинке.
Либо может я где ошибся, т.к. пост много очень раз обновлялся уже.
Спасибо что заметили. Выделю время и перепроверю.

Reply
Ювик 20 октября 2021 - 21:18

Здравствуйте А можете подсказать с такой ошибкой? RpiZW qt5.12.3

EGL Error : Could not create the egl surface: error = 0x300b

Reply
Pavelk 20 октября 2021 - 22:50

Здравствуйте. А разве Raspberry Pi Zero W поддерживает OpenGL ES 2.0 ? Если да, то смотрите по логам чему ему не хватает. У меня, к сожалению, нет платы, что бы проверить.

Reply
Ювик 21 октября 2021 - 21:15

Вроде как пишут «Fully supports OpenGL-ES 1.1/2.0 and OpenVG 1.1». Там тот же проц что и на Raspberry Pi 1. Сейчас с более старой RaspOS пробую выдаёт «Недопустимая инструкция». Обидно как то =(

Reply
Pavelk 22 октября 2021 - 1:35

Увы, с этой ошибкой поможет только ldd по каждой либе и смотреть чего не хватает + включить лог загрузки компонентов Qt.
Мне тут добрый человек уже выслал плату, только без W, через неделю придёт попробую собрать.

Reply
Ювик 26 октября 2021 - 17:00

Похоже я начал понимать в чём проблема.
https://stackoverflow.com/questions/55465118/gcc-8-cross-compiler-outputs-armv7-executable-instead-of-armv6

Владимир 22 июня 2020 - 18:30

Severity Code Description Project File Line Suppression State
Warning CMake Warning (dev) in log/CMakeLists.txt:
AUTOGEN: No valid Qt version found for target log. AUTOMOC, AUTOUIC and
AUTORCC disabled. Consider adding:

find_package(Qt COMPONENTS Widgets)

to your CMakeLists.txt file.
This warning is for project developers. Use -Wno-dev to suppress it. log C:\Work\UniTest\PultPro\ AUTORCC disabled. Consider adding
===========================
Severity Code Description Project File Line Suppression State
Warning CMake Warning at log/CMakeLists.txt:14 (find_package):
By not providing «FindQt5Widgets.cmake» in CMAKE_MODULE_PATH this project
has asked CMake to find a package configuration file provided by
«Qt5Widgets», but CMake did not find one.

Could not find a package configuration file provided by «Qt5Widgets» with
any of the following names:

Qt5WidgetsConfig.cmake
qt5widgets-config.cmake

Add the installation prefix of «Qt5Widgets» to CMAKE_PREFIX_PATH or set
«Qt5Widgets_DIR» to a directory containing one of the above files. If
«Qt5Widgets» provides a separate development package or SDK, be sure it has
been installed. log C:\Work\UniTest\PultPro\log/CMakeLists.txt 14

Reply
Владимир 22 июня 2020 - 18:27

Добрый день,
а вот настроил кросссборку на VS19 …
проект собирается и под
Малина чистая, без развернутого QT
раньше делали вот так:
sudo apt-get install qt5-default

а сейчас хотелось бы подложить только нужные либы на Малину, ну чтобы только то, что надо, без QTCreator и т.п. хвостой.
как корректно выцепить нужные модули и куда их сложить и как настроить CMake?

Reply
Andrei 18 мая 2020 - 2:34

В настоящее время широкое распространения получили одноплатники OPI, такие как OPI PC PLUS. Было бы здорово получить инструкцию о кросскомпиляции на OPI. Я попытался следовать этому роководству для armbian на OPI PC PLUS, но не смог решить проблемы с графикой. При этом kmscube запускается, кубик вращается. Конфигурировал
./configure -skip wayland -skip script -skip webengine -no-pch -no-kms -no-xcb -no-use-gold-linker -nomake tests -nomake examples -reduce-exports -eglfs -release -opengl es2 -device linux-rasp-pi2-g++ -device-option CROSS_COMPILE=/home/andrei/Qt5Sources/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- -opensource -confirm-license

Очевидно у меня компилятор gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf Потому что я с ноута на Ubuntu 19.

Получил:
EGL ……………………………… no
OpenVG …………………………… no
OpenGL:
Desktop OpenGL ………………….. no
OpenGL ES 2.0 …………………… no
OpenGL ES 3.0 …………………… no
OpenGL ES 3.1 …………………… no
OpenGL ES 3.2 …………………… no
Vulkan …………………………… no
Session Management ………………… yes
Телодвижения делал такие https://visuale.ru/blog/krosskompilyatsiya-qt-5-10-dlya-raspberry-pi3 Шутки ради накатил на OPI PC PLUS ПО Qt Creator из репозитория, создал, собрал и запустил Hello World успешно на самом SBC.

Reply
Roma 21 ноября 2019 - 3:25

Здравствуй! Для raspberry pi 4 какой commend нужен?

Reply
Pavelk 21 ноября 2019 - 3:28

Доброго дня. Для неё мануал ещё в процессе, т.к. есть множество нерешённых проблем.

Reply
Александр 22 ноября 2019 - 16:49

Такой вопрос не знаю как решить.
Я запускаю проект на малине через qt creator на хосте все работает, четко, как часы.
Когда я запускаю исполняемый файл с малины или через ssh, приложение запускается, дебаг в консоль пишет сообщения, однако вместо экрана с картинкой получаю белый экран.

Reply
Алексей 24 августа 2019 - 16:46

Огромное спасибо!!! Долгое время не мог запустить QML на Raspberry, все инструкции были только к старым версиям. Наконец-то кто-то грамотно описал все этапы!

Reply
Pavelk 25 августа 2019 - 2:01

Пожалуйста =)

Reply
Алексей 22 сентября 2019 - 2:08

Возможно вы знаете, как решить проблему? Приложение на QML, запускается на долюсекунду и затем умирает. В логах выдает следующее:

Could not find the Qt platform pllugin «xcb» in «»
EGLFS: OpenGL windows cannot be mixed with others.

Reply
Pavelk 9 октября 2019 - 4:51

Здравствуйте.
Скорее всего, нужно в QML основным компонентом использовать только Window { … }, а в main.cpp использовать QQmlApplicationEngine.

Reply
Andrew 26 августа 2018 - 17:58

Здравствуйте!

Ликбез не сработал.
1) Не существует указанная здесь Raspbian 2017-09-07 Stretch, ближайшая Raspbian 2017-09-08 пруф http://downloads.raspberrypi.org/raspbian/images/

На ней получаю ошибку при конфигурации. У меня Raspberry pi 1
ERROR: Feature ‘opengles2’ was enabled, but the pre-condition ‘config.win32 || (!config.watchos && !features.opengl-desktop && libs.opengl_es2)’ failed.
ERROR: The OpenGL functionality tests failed!

При этом сверху, разумеется, нет поддержки графики
EGL ……………………………… no
OpenVG …………………………… no
OpenGL:
Desktop OpenGL ………………….. no
OpenGL ES 2.0 …………………… no
OpenGL ES 3.0 …………………… no
OpenGL ES 3.1 …………………… no
OpenGL ES 3.2 …………………… no
Vulkan …………………………… no
Session Management ………………… yes

Пытался менять названия либ как тут написано… Пытался отсюда брать названия (+тут ещё конектят OpenVG) https://github.com/ali1234/qtbase/commit/0da9755921397593524bca3bdd508e798736a7f1 В итоге не помогающий файл /home/lin/Music/opt/qt-everywhere-src-5.11.1/qtbase/mkspecs/devices/linux-rasp-pi-g++/qmake.conf такой

# qmake configuration for:
# — Raspberry PI
# — Raspberry PI Zero
# http://wiki.qt.io/RaspberryPi

include(../common/linux_device_pre.conf)

#QMAKE_RPATHLINKDIR_POST += $$[QT_SYSROOT]/opt/vc/li
QMAKE_LFLAGS += -Wl,-rpath-link,$$[QT_SYSROOT]/opt/vc/lib
QMAKE_LIBDIR_OPENGL_ES2 = $$[QT_SYSROOT]/opt/vc/lib
QMAKE_LIBDIR_EGL = $$QMAKE_LIBDIR_OPENGL_ES2
QMAKE_LIBDIR_OPENVG = $$QMAKE_LIBDIR_OPENGL_ES2

QMAKE_INCDIR_EGL = $$[QT_SYSROOT]/opt/vc/include \
$$[QT_SYSROOT]/opt/vc/include/interface/vcos/pthreads \
$$[QT_SYSROOT]/opt/vc/include/interface/vmcs_host/linux
QMAKE_INCDIR_OPENGL_ES2 = $${QMAKE_INCDIR_EGL}
QMAKE_INCDIR_OPENVG = $${QMAKE_INCDIR_EGL}

MAKE_LIBS_EGL = -lbrcmEGL -lbrcmGLESv2
QMAKE_LIBS_OPENGL_ES2 = -lbrcmEGL -lbrcmGLESv2
QMAKE_LIBS_OPENVG = -lbrcmEGL -lbrcmOpenVG -lbrcmGLESv2

contains(DISTRO, squeeze) {
#Debian Squeeze: Legacy everything
QMAKE_LIBS_OPENGL_ES2 = -lbrcmGLESv2 -lbrcmEGL
} else:contains(DISTRO, arch) {
#On principle: no wizardry required
} else {
#This is not strictly necessary
DISTRO_OPTS += deb-multi-arch
DISTRO_OPTS += hard-float
}

QMAKE_CFLAGS += \
-marm \
-mfpu=vfp \
-mtune=arm1176jzf-s \
-march=armv6zk \
-mabi=aapcs-linux

QMAKE_CXXFLAGS = $$QMAKE_CFLAGS

# Preferred eglfs backend
EGLFS_DEVICE_INTEGRATION = eglfs_brcm

include(../common/linux_arm_device_post.conf)

load(qt_config)

Ошибка на этапе root@Linux:/home/lin/Music/opt/qt-everywhere-src-5.11.1# ./configure -opengl es2 -device linux-rasp-pi-g++ -device-option CROSS_COMPILE=$BASEPATH/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf- -sysroot $BASEPATH/sysroot -opensource -confirm-license -make libs -prefix $BASEPATH/qt-everywhere-src-5.11.1 -extprefix $BASEPATH/qt-everywhere-src-5.11.1 -hostprefix $BASEPATH/qt-everywhere-src-5.11.1 -v

Файлы libbrcmEGL.so libbrcmGLESv2.so существуют в /home/lin/Music/opt/sysroot/opt/vc/lib Меня смущает название, мы ведь подключаем «-lbrcmGLESv2» а он как-бы «-libbrcmGLESv2» и т.д.

Вот отчёт из консоли https://yadi.sk/i/DS_yNLG13aZoAa

На соседнем ликбезе та же ошибка https://lb.raspberrypi.org/forums/viewtopic.php?t=204529

Была мысль, что мой Raspberry pi 1 (2011) не поддерживает графику, но при sudo raspi-config я назначаю G1 GL (Full KMS) OpenGL desktop driver with full KMS, значит, графика есть. Прошу о помощи.

Reply
Pavelk 28 августа 2018 - 2:05

Увы, но помочь я Вам не могу, так как нету первой малинки.
Могу разве что посоветовать Qt использовать более ранних версий, например 5.4 или 5.6.

Reply
Pavelk 28 августа 2018 - 2:07

А, на первой малинке вообще есть поддержка OpenGL ES 2.0 хотя бы ? По-моему старовата она для него.

Reply
Vise 8 ноября 2017 - 9:30

Приветствую. Насчет ошибки undefined reference to `__cxa_throw_bad_array_new_length@CXXABI_1.3.8′. Это говорит о том что на целевой машине версия stdlibc++ сильно отличается от той, что используется при кросскомпиляции. Поэтому после git clone https://github.com/raspberrypi/tools узнаем версию полученного компилятора например /opt/raspi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-gcc -v и видим что то типа gcc версия 4.8.3 20140303 (prerelease) (crosstool-NG linaro-1.13.1+bzr2650 — Linaro GCC 2014.03). После этого заходим на малину по ssh, выполняем gcc -v и видим что то типа gcc version 6.3.0 20170516 (Raspbian 6.3.0-18+rpi1). Сами понимаете собирать компилятором версии 4.8.3 под систему с gcc версии 6.3.0 не самая лучшая идея :))))) Поэтому идем сюда https://releases.linaro.org/components/toolchain/gcc-linaro/ качаем версиюю gcc совпадающую с той что стоит на малинке, правим CROSS_COMPILE=путь к новому компилятору. Вот теперь должно нормально собираться. Еще при запуске приложения на малине бывает полезным указать платформу: ./qopenglwidget —platform xcb. Ну или к примеру —platform wayland. Если вдруг, неожиданно вы нашли дистрибутив с вяленным :)))))

Reply
Юрий 3 ноября 2017 - 9:14

Павел, спасибо за статью.
Можно попросить обновить ее? Особенно в части ./configure
Проблемы начинаются на этапе выбора ветки.
1. По команде git branch -r видим, что ветки 5.9.1 не существует:
origin/5.9.0
origin/5.9.3
origin/HEAD -> origin/5.10

2. Похоже, webkit перестал существовать. Поэтому, выполняя ./configure, получаем ошибку:
Project ERROR: -skip command line argument used with non-existent module ‘qtwebkit’. Просто убрать -skip qtwebkit приводит просто к следующим ошибкам:

3. raspi/Qt59Sources/qtbase/config.tests/arch/arch.cpp:43:19: fatal error: stdio.h: No such file or directory
> #include
> ^
> compilation terminated.
> Makefile:179: recipe for target ‘arch.o’ failed
> make: *** [arch.o] Error 1
Project ERROR: Could not determine target architecture. See config.log for details.

Все подкладывания заголовков не помогли.
Пробовал все ветки от 5.9 до 5.10

Правда, не пробовал вот что: мой рабочий Qt, установленный на хосте, имеет версию 5.8. Не думаю, что это связано, но сейчас обновлюсь до 5.10.

Поможете разобраться? Заранее спасибо.

Reply
Pavelk 3 ноября 2017 - 23:57

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

Reply
Дмитрий 16 ноября 2017 - 15:02

Я столкнулся с той же проблемой и никак не могу её побороть. Подскажите, пожалуйста, у Вас получилось справиться с данной проблемой?

Reply
Михаил 15 октября 2017 - 14:08

МУЖИК! Огромное спасибо! Если можно, скажи куда задонатить! Ей Богу две недели пытался собрать бессонными ночами из-за того, что везде всё либо старые версии либо вообще черт пойми что, пока на одном из форумов на твой пост не скинули ссылку. Завелось всё с первого раза. Шаг 11 не делал, всё запустилось. Ещё раз спасибо!

Reply
Дима 20 октября 2017 - 0:27

Михаил можете помочь с кросс компиляцией,собираю что-то да все криво(

Reply
Руслан 2 октября 2017 - 19:58

Подскажите, не собирает Qt
make: Цель «first» не требует выполнения команд.
Info: creating super cache file /home/lnxdx/raspi/Qt59Sources/.qmake.super
Command line: -skip wayland -skip webkit -no-xcb -no-icu -nomake tests -nomake examples -c++std 11 -optimized-qmake -reduce-exports -no-pch -release -opengl es2 -device linux-rpi3-g++ -no-use-gold-linker -device-option CROSS_COMPILE=/home/lnxdx/Projects/RaspberryPI/raspi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf- -sysroot /home/lnxdx/Projects/RaspberryPI/raspi/sysroot -opensource -confirm-license -make libs -prefix /home/lnxdx/Projects/RaspberryPI/raspi/qt5pi -extprefix /home/lnxdx/Projects/RaspberryPI/raspi/qt5pi -hostprefix /home/lnxdx/Projects/RaspberryPI/raspi/qt5 -v
ERROR: No device matching ‘linux-rpi3-g++’.

Reply
Pavelk 11 октября 2017 - 5:55

попробуйте вместо linux-rpi3-g++ в конфигурации прописать linux-rasp-pi3-g++.

Reply
Руслан 30 июня 2017 - 11:06

Приветствую. Подскажите пожалуйста как в такую сборку добить какой-нибудь модуль? Например мне нужен QSerialPort. Однако несмотря на то что это пятый qt, сериалПорта нигде нет. пробовал устанавливать libqt5serialport5-dev. Не помогло.

Reply
Pavelk 11 октября 2017 - 5:59

git clone git://code.qt.io/qt/.git -b
cd
~/raspi/qt5/bin/qmake -r
make
make install

и потом скомпиленные либы через rsync закинуть на малинку.

Reply
Yuri Zhurakovsky 24 апреля 2017 - 13:58

И первый пример, приведенный в мануале, тоже не запускается:
./qopenglwidget: /usr/lib/arm-linux-gnueabihf/libQt5Widgets.so.5: no version information available (required by ./qopenglwidget)
./qopenglwidget: /usr/lib/arm-linux-gnueabihf/libQt5Gui.so.5: no version information available (required by ./qopenglwidget)
./qopenglwidget: /usr/lib/arm-linux-gnueabihf/libQt5Core.so.5: no version information available (required by ./qopenglwidget)
Illegal instruction

Reply
Pavelk 14 мая 2017 - 23:19

Что-то с ldconfig или qt.conf либо пути не правильные, либо не скопировалось в устройство, либо ld не видит эти файлы. ldd может помочь, вдруг какие зависимости не установились.

Reply
Yuri Zhurakovsky 24 апреля 2017 - 13:56

Здравствуйте.
Огромное спасибо за мануал. Это реально первый мануал, по которому все собралось. Однако, скомпилировать простейший пример так и не получилось.
Про попытке сбилдить простейший консольный HelloWorld вылетает вот такая ошибка: /sysroot/usr/lib/arm-linux-gnueabihf/libicui18n.so.52: undefined reference to `__cxa_throw_bad_array_new_length@CXXABI_1.3.8′

Reply
Pavelk 14 мая 2017 - 23:18

Удалось повторить, собирайте Qt без ICU: добавить в .configure «-no-icu» в посте обновил.

Reply
Yuri Aviator 6 апреля 2017 - 0:35

Хороший мануал. Единственное — надо скопировать папочку с библиотеками qt в sysroot/usr/local.
иначе пример собирается с библиотеками qt другой версии, которые уже стояли в образе Raspbiana.

pi@raspberrypi:~ $ ldd qopenglwidget
./qopenglwidget: /usr/lib/arm-linux-gnueabihf/libQt5Widgets.so.5: no version information available (required by ./qopenglwidget)
./qopenglwidget: /usr/lib/arm-linux-gnueabihf/libQt5Gui.so.5: no version information available (required by ./qopenglwidget)
./qopenglwidget: /usr/lib/arm-linux-gnueabihf/libQt5Core.so.5: no version information available (required by ./qopenglwidget)

Reply
Pavelk 25 апреля 2017 - 1:30

Это восьмым пунктом как раз делается.

Reply
тарас 23 марта 2017 - 23:43

и вот такая в квик котрол2
:-1: ошибка: Не удалось отправить файл «/home/rea/build-untitled-Raspberry_Pi-Debug/untitled».

Reply
тарас 23 марта 2017 - 23:40

у меня такая ошибка
bash: /home/pi/prob: No such file or directory
Приложение завершилось с кодом 127.

Reply
@!!ex 21 марта 2017 - 23:03

Спасибо!
Слава гуглу, https://wiki.qt.io/RaspberryPi2EGLFS и вам!

Reply
reanon 18 марта 2017 - 20:37

добрый день. делаю по этому сануалу вот эту коммаду ./sysroot-relativelinks.py sysroot
и получаю вот такую ошибку
rea@rea-GA-990XA-UD3:~/raspi$ ./sysroot-relativelinks.py sysroot
Replacing /lib/ld-linux-armhf.so.3 with ld-linux-armhf.so.3 for /home/rea/raspi/sysroot/lib/ld-linux.so.3
Traceback (most recent call last):
File «./sysroot-relativelinks.py», line 31, in
handlelink(filep, subdir)
File «./sysroot-relativelinks.py», line 23, in handlelink
os.unlink(filep)
OSError: [Errno 13] Permission denied: ‘/home/rea/raspi/sysroot/lib/ld-linux.so.3’
подскажите куда копать

Reply
Pavelk 29 марта 2017 - 18:38

Что-то с правами доступа. Попробуйте перед запуском линковщика ссылок прописать sudo

Reply
TNT 17 февраля 2017 - 16:07

А -prefix не должно быть: /usr/local/qt5pi , как у http://wiki.qt.io/RaspberryPi2EGLFS ?

Reply
Pavelk 18 февраля 2017 - 14:51

На ваше усмотрение. Указывая prefix мы говорим куда складывать результат сборки. В посте у меня путь ~/Projects/RaspberryPI/raspi/qt5pi что бы не засирать систему и не бегать искать.

Reply
Артур 8 февраля 2017 - 1:04

Разобрался, проблема оказалась в том, что у меня уже QT стоял на плате. Получалось что когда выкачивал сисрут, то библиотеки конфликтовали, поэтому брать чистый образ мегаважно. Спасибо за статью, очень пригодилось

Reply
Артур 2 февраля 2017 - 2:12

Приветствую. Пробую повторить все тоже самое, но qt не собирается. Падает в процессе компиляции. Можете дать хоть какую то наводку где мог косякнуть. Посмотрел linaro версии 4.7, qt как и у вас 5.7. sysroot выкачал с малины. Уже что только не пробовал, все равно падает

Reply
Pavelk 5 февраля 2017 - 2:26

Какие ошибки?

Reply
reanon 19 марта 2017 - 11:18

с предыдущей ошибкой справился.
делаю вот это
/Projects/RaspberryPI/raspi/Qt57Sources$ ./configure -skip wayland -c++std 11 -skip webkit -release -opengl es2 -device linux-rasp-pi2-g++ -device-option CROSS_COMPILE=$BASEPATH/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf- -sysroot $BASEPATH/sysroot -opensource -confirm-license -make libs -prefix $BASEPATH/qt5pi -extprefix $BASEPATH/qt5pi -hostprefix $BASEPATH/qt5 -v -no-use-gold-linker

и получаю ошибки
очень много.
куда копать ? зарание спасибо

Reply

Leave a Comment

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

You may also like