Qt на BeagleBoard / BlueShark

Qt- очень удобный кроссплатформенный фреймворк для создания GUI (графического интерфейса пользователя) и не только. Qt содержит множество модулей и библиотек, упрощающих программирование на C++. Очень полезной фишкой Qt является возможность запуска программ с GUI без X-server. Программы на Qt умеют «рисоваться» напрямую во фреймбуфер (framebufer, fb) видеосистемы.

Я пишу эту статью для того, чтобы упорядочить свои небольшие знания и достижения, которые я успел получить на текущий момент. Поэтому, возможно, в статье есть какие-то неточности. Буду рад конструктивной критике и советам.

Кросскомпиляция

Кросскомпиляция- это когда программа для одной системы (target) компилируется в другой (host). Это нужно если host-система на много производительнее, чем target. Это именно так в случае с встраиваемыми (embedded) системами. Поэтому программы для них компилируют на обычном PC, а работают они уже, например, на ARM.

Далее рассматриваем, что terget-система на базе ARM.

Для кросскомпиляции нужен кросскомпилятор (внезапно :-) ). Есть компиляторы
-none-eabi и -linux.

Первый предназначен для сборки программы, которая будет исполняться на голом процессоре. Он генерирует на выходе прошивку, как компилятор AVR-GCC, например, только не для AVR, а для ARM.

А второй предназначен для сборки программ, которые будут работать в среде встраиваемого Linux. Он генерирует исполняемый файл для Linux.

То, что это разные вещи, по-моему, очевидно.

Следует обратить внимание, что для этой работы нам потребуется машина с Linux. Вообще, все возможно сделать и в Windows, но если вы уж решили заняться встраиваемым линуксом, то работайте в линуксе, дабы не заниматься костылестроением для костылей.

Я использую Ubuntu 11.04 на виртуальной машине VM Ware. Установка виртуальной машины и убунту элементарна и не нуждается в описании.

Программа на Qt

Займемся написанием нашей первой тестовой программы на Qt для встраиваемой системы.

Проще всего это сделать используя Qt-Creator. Это специализированная IDE для разработки с использованием Qt. Скачать ее можно на qt.nokia.com. А в Ubuntu достаточно набрать команду

sudo apt-get install qtcreator

Создадим проект с именем testGUI. Создадим форму с парой кнопочек или еще чего нибудь. Сохраним проект. Среди прочих файлов проекта будет самый важный — testGUI.pro — XML файл описания проекта.

Теперь надо немного отвлечься и скомпилировать сам Qt.

Компиляция Qt под BeagleBoard / BlueShark

Качаем кросскомпилятор
http://www.codesourcery.com/sgpp/lite/arm/portal/package4571/public/arm-none-linux-gnueabi/arm-2009q1-203-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2

Качаем исходники Qt qt-everywhere-opensource-src-4.7.2.tar.gz
Качаем патч на Qt для BeagleBoard https://docs.google.com/uc?id=0BywvSqtpDKuCMjk1NmZlZTktNTg4ZC00MWEwLWExOTktNzRiZTE2OTZjZjFk&export=download&hl=en

tar -xzf ./qt-everywhere-opensource-src-4.7.2.tar.gz
cd ./qt-everywhere-opensource-src-4.7.2/
patch -p1 < ../../qt-4.7.2-arm-beagleboard-xm-qmake.patch


Конфигурируем Qt

./configure -nomake tools -nomake examples -nomake demos -nomake docs -nomake translations -opensource -confirm-license -prefix /opt/qt -embedded arm-gnueabi -platform /qws/linux-x86-g++ -xplatform qws/linux-beagle-g++ -depths 16,24,32 -no-mmx -no-3dnow -no-sse -no-sse2 -no-qt3support -no-glib -no-cups -no-largefile -no-accessibility -no-openssl -no-gtkstyle -qt-mouse-pc -qt-mouse-linuxtp -qt-mouse-linuxinput -plugin-mouse-linuxtp -plugin-mouse-pc -fast -no-javascript-jit -no-script -no-scripttools -no-declarative -no-declarative-debug --no-gif -no-libtiff -no-libpng -no-libmng -qt-libjpeg -no-nis -no-iconv -no-pch -no-gtkstyle -no-opengl -no-openvg -no-sm -no-xshape -no-xvideo -no-xsync -no-xinerama -no-xcursor -no-xfixes -no-xrandr -no-xrender -no-mitshm -no-xinput -no-xkb -no-xmlpatterns -no-webkit -no-sql-sqlite -no-sql-sqlite2 -little-endian

Компилируем
make
make install INSTALL_ROOT=/


В результате получаем директорию /opt/qt/

В ней есть папка bin — в ней инструментарий для сборки приложений на Qt. Эти программы собраны для x86. А все библиотеки Qt собраны под ARM.

Вернемся к нашей программе. Компилируем ее под ARM
cd testgui

Сначала пропустим нашу программу через препроцессор
/opt/qt/bin/qmake testgui.pro

В результате получим makefile
Теперь программу можно компилировать
make

Чтобы убедится, что программа собрана под ARM проверяем это с помощью команды
file testgui

testgui: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs)

Программу можно переносить на BeagleBoard/BlueShark. Только работать она там не будет. Пока мы не перенесем туда же все необходимые библиотеки.

От Qt переносим в /opt/qt все, кроме bin, примеров и документации (если есть). А от кросскомпилятора нас интересует файл libstdc++.so, который переносим в /usr/lib. Также нужно создать симлинк libstdc++.so->libstdc++.so.6

Программу запускать необходимо так
./testgui -qws

Результат:



Ссылки:
Документация от Nokia
  • 0
  • 28 сентября 2011, 20:06
  • rcdimon

Комментарии (16)

RSS свернуть / развернуть
пути до библиотек лучше добавить в PATH.
и там небольшая опечатка. должно быть
sudo apt-get install qtcreator

но это так, мелочи.
для тестирования и отладки еще можно попробовать qvfb.
0
дополнительно, по правилам еще надо сделать симлинк libstdc++.so->libstdc++.so.6
0
Спасибо, поправил. Из головы вылетело.

Еще нужно добавить, что тут есть много документации
doc.qt.nokia.com/latest/qt-embedded-linux.html
0
Я пока только начинаю изучать линукс, поэтому у меня возникли трудности с пониманием некоторых моментов. Хотелось бы, чтобы знающие люди прояснили ситуацию. Итак:
1) Откуда конкретно надо скопировать libstdc++.so? В папке /opt/arm-2009q1/arm-none-linux-gnueabi/libc их нашлось аж 3 (!) штуки.
2) Как я смог понять файл libstdc++.so — это ссылка на «разделяемую библиотеку», а сама разделяемая библиотека называется libstdc++.so.6.0.10. Это действительно так или я чего-то не понимаю? Так что все-таки надо копировать? Только ссылку на разделяемую библиотеку libstdc++.so? А что делать с разделяемой библиотекой libstdc++.so.6.0.10? Совсем запутался :-(
3) Что означает фраза «сделать симлинк libstdc++.so->libstdc++.so.6»? Это команда, которую надо написать в терминале? Или это условной обозначение и сама команда имеет другой вид (какой)?
Спасибо.
0
1) Что значит аж 3 штуки? В разных папках одно и то же?
2) Именно так. Сама библа libstdc++.so.6.0.10, а что бы можно обновлять ее без пересборки всего ПО и не переименовывать саму библу, на нее делают линк с уже рабочим названием libstdc++.so. И библа и линк должны лежать рядом.
3) Переходим в каталог где лежит libstdc++.so.6 и командуем от рута:
# ln -s libstdc++.so.6 libstdc++.so
или
# ln -s libstdc++.so.6.0.10 libstdc++.so
смотря что там у вас в папке.
0
1) Ну да. Вот эти папки:
— /opt/arm-2009q1/arm-none-linux-gnueabi/libc/usr/lib;
— /opt/arm-2009q1/arm-none-linux-gnueabi/libc/thumb2/usr/lib;
— /opt/arm-2009q1/arm-none-linux-gnueabi/libc/armv4t/usr/lib;
Скопировал из первой папки файл libstdc++.so.6.0.10. Далее сделал как указано в пункте 3 предыдущего поста, запустил файл на исполнение и все заработало. Всем спасибо!
0
может быть глупый вопрос, но почему используется компилер такой старый?
sourcery.mentor.com/sgpp/lite/arm/portal/subscription3057 — уже много релизов после вышло
0
Точного ответа на этот вопрос, к сожалению, не знаю. С компиллером от 2011 года программа работать отказалась. Скомпилировалась, но запускаться отказалась. Потом я нашел статью где написано, что «нужно собирать вот этим». Попробовал- получилось. Глубже не вникал. Но вообще мне самому интересно. Если кто знает- пишите.
0
… все что будет выполнять BeagleBoard это показывать нарисованное нами приложение или это всего лишь одно из приложений установленных в embedded linux?
0
Ну многозаданость же никто не отменял. Может выполняться паралельно множество процессов, в том числе и графических программ на Qt- они сами рисуют свои окна. Запускайте все, что вашей душе угодно, пока аппаратные возможности позволяют.
0
Спасибо, надо будет попробовать!

А OpenCV Вы не прикручивали к BB?
0
Это трудоемко (правда я говорю с точки зрения FriendlyARM). В opencv highgui завязан на GTK, а собрать gtk под embedded проблематично. Без него с наскока тоже не собралось, на тот момент забил, стал пробовать Debian arm запустить.
0
Я так понимаю, перечисленные Вами слова типа highgui надо гуглить и смотреть в документации на OpenCV, да? :)
0
highgui это часть opencv для построение простых интерфейсов пользователя.
0
-no-libpng
Зря, png картинки могут понадобится в гуе.
0
Ну это всего лишь пример.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.