- Настройка qt creator linux для arm
- Ставим линукс
- Подготовка rootfs
- Установка обновлений (выполняем на BeagleBone)
- Установка зависимостей
- Подготовка директории на диске
- Создание снимка rootfs
- Сборка QT для кросс-компиляции
- Подготовка машины для сборки
- Скрипт сборки Qt
- Собранный Qt для ARM
- qmake для кросс-компиляции
- Кросс-компиляция Qt-приложений под ARM
- Возможные проблемы
- 1. gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux/bin/arm-linux-gnueabihf-g++: error while loading shared libraries: libstdc++.so.6
- 2. arm-linux-gnueabihf/libz.a: error adding symbols: Bad value
- 3. crosscompile-Qt_5.2.1-beaglebone-black.sh: /opt/qt-beaglebone/Qt-5.2.1/bin/qmake: not found
- 4. undefined reference to `clock_gettime`
- 5. undefined reference to `__dlopen’
- собрать Qt 5 для ARM
Настройка qt creator linux для arm
На сегодняшний день в сети есть достаточно много мануалов сборки qt4.8 для Raspberry PI или BeagleBone Black, но они уже безвозвратно устарели (изменились опции для ./configure).
В сети уже есть несколько инструкций как собирать qt5.2 и qt5.5, но без дополнительных тайных знаний вы можете потратить много времени и нервов, так ничего и не добившись.
За основу я взял статью Simon Stürz : Crosscompile Qt 5.2.1 for the Beaglebone Black и скрипт автоматической сборки, делающий всю работу за вас.
Здесь же не только перевод этой статьи, но и важные ньюансы и пояснения, позволяющие вам не тратить много времени на набивании шишек.
Ставим линукс
Есть куча примеров кросс-компиляции под windows, но если вы хотите сэкономить себе время и нервы, используйте Linux. Позже, когда вы разберётесь как всё работает на линуксе, можно уже будет попробовать собрать и под виндой.
Ставить линукс второй операционной системой вовсе не обязательно, вы можете запустить его на виртуальной машине, например при помощи VirtualBox. Такой способ будет даже удобнее: пока идёт сборка qt можно спокойно работать на основной машине.
Ставим Ubuntu 14.04. Если вы ставите Linux на виртуалку, то настоятельно рекомендую именно этот дистрибутив или другой хорошо распространнённый. Посколько в других дистрибутивах могут отличаться названия пакетов.
Подготовка rootfs
Для успешной сборки нам понадобится образ файловой системы с вашего работающего Beaglebone. Это нужно, чтобы слинковаться с конкретными библиотеками, установленными на вашу систему.
Важно: для образа вашей файловой системы используйте SD-карту. Файловую систему на карте памяти намного проще скопировать на компьютер. Делается это через обычный кардридер. Сложнее скопировать файловую систему на внутренней памяти BeagleBone: для этого придётся разбираться с копирование файлов по SSH.
В качестве дистрибутива для BeagleBone я использую Debian 7.9.
Установка обновлений (выполняем на BeagleBone)
Для начала, установим системные обновления:
Установка зависимостей
Все библиотеки и include-файлы, необходимые для сборки Qt будут браться не с вашего компьютера, а с rootfs BeagleBone. Поэтому, необходимо поставить туда все необходимые пакеты.
Зависимости для libxcb:
Зависимости для QtMultimedia:
Зависимости для QtWebEngine:
Зависимости для QtConnectivity (поддержка Bluetooth):
Работы с шиной I2C (если вы не знаете что это такое, то скорее всего вам это не нужно):
Подготовка директории на диске
Прежде чем копировать образ файловой системы с BeagleBone на компьютер, нужно подготовить директорию.
Важно: директория на вашей TARGET-машине будет в точности соответствовать директории на HOST-машине (BeagleBone). Т.е если вы решите производить сборку в /home/vasya/Projects/build. То все пути будут завязаны именно на эту директорию. Настоятельно рекомендуется указывать пути не зависящие от конкретного пользователя. Например /opt/qt-beaglebone/.
Создаём директорию под рутом (т.к. обычный пользователь не может писать в корень диска) и меняем владельца на текущего пользователя:
Создание снимка rootfs
Извлекаем карту памяти из BeagleBone, вставляем её в кард-ридер своего компьютера.
Затем монтируем файловую систему sd-карты (под Ubuntu файловая система монтируется сама) и заходим в корень смонтированной файловой системы.
Сборка QT для кросс-компиляции
Подготовка машины для сборки
Ставим необходимые пакеты:
Скрипт сборки Qt
Можно было бы самим скачать пакет qt-everywhere-opensource. Наложить на него патч для поддержки BeagleBone и компилятора gcc-linaro-arm-linux-gnueabihf, но есть уже готовый скрипт от товарища Simon Stürz. С 2015 года пути немного поменялись и скрипт безнадёжно устарел. Пришлось его немного допилить. Новый скрипт можно взять здесь.
Если у вас есть rootfs со всеми необходимыми библиотеками, то остальное скрипт сделает за вас. Нужно только его скачать и запустить:
Скрипт распакует архив с rootfs (лучше не удалять исходный архив. Если что-то пойдёт не так вы всегда сможете вернутся к исходной версии). Далее скрипт скачает дистрибутив Qt-5.2.1, компилятор и начнёт сборку.
Собранный Qt для ARM
Собранный Qt будет лежать на распакованном образе rootfs в директории /opt/qt-beaglebone/. Полный путь на вашей HOST-машине будет: /opt/qt-beaglebone/rootfs/opt/qt-beaglebone/Qt-5.2.1/.
qmake для кросс-компиляции
qmake для кросс-компиляции будет находиться здесь: /opt/qt-beaglebone/Qt-5.2.1
Компилятор будет находиться здесь: /opt/qt-beaglebone/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux/bin
Кросс-компиляция Qt-приложений под ARM
Кросс компиляции Qt-приложений под ARM будет посвещена следующая статья.
Возможные проблемы
1. gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux/bin/arm-linux-gnueabihf-g++: error while loading shared libraries: libstdc++.so.6
Решение: скорее всего не хватает пакетов на вашей сборочной системе:
2. arm-linux-gnueabihf/libz.a: error adding symbols: Bad value
Вместо libz.so тут может быть любая библиотека. Проблема в то, что libz.so не найден на вашей файловой системе. И компилятор пытается использовать вместо динамической либы libz.so статическую libz.a, которой тоже нет на вашей rootfs. Решение: идём в директорию rootfs и создаём libz.so как ссылку на существующую библиотеку (в моём случае это libz.so.1.2.7).
Скорее всего тоже самое придётся проделать и для других библиотек. Мне пришлось повторить это действие для libm.so, libdl.so. Притом в директориях /lib/arm-linux-gnueabihf и /usr/lib/arm-linux-gnueabihf
Внимание! Проверять нужно не только наличие библиотеки *.so но и куда ссылается символическая ссылка.
Т.е. символическая ссылка с абсолютными путями и ссылается не на библиотеку для Beaglebone, а на библиотеку для x86 процессора, на котором мы выполняем сборку.
3. crosscompile-Qt_5.2.1-beaglebone-black.sh: /opt/qt-beaglebone/Qt-5.2.1/bin/qmake: not found
Найдя директорию Qt-5.2.1, скрипт считает, что всё уже собрано, и пытается запустить qmake, который не собрался из-за ошибки. Самый простой способ будет — удалить директорию Qt-5.2.1.
4. undefined reference to `clock_gettime`
Проблема линковки в librt.so. Для неё также нужно создать символическую ссылку как для libz.so, обозначенной во второй проблеме.
5. undefined reference to `__dlopen’
Та же самая проблема, что и проблема 2: /usr/lib/arm-linux-gnueabihf/libdl.so отсутствует, либо символическая ссылка ведёт не туда.
Исправляем:
То же самое нужно сделать и для libm.so.
Если и это не помогает, то удаляем/переименовываем статическую библиотеку, чтобы компилятор начал использовать динамическую:
Источник
собрать Qt 5 для ARM
Начну с того, что Yocto/OpenEmbedded(/Buildroot) юзал и собирал Qt 5 в их составе под ARM архитектуру.
Сейчас же стоит задача вкатить на устройство, на котором крутится Linux ARM (вероятно Debian Wheezy), в рабочей ФС не стоит Qt 5 и ничего установить обновить нет возможности — это embedded сборка. Выход — просто скопировать туда свое приложение вместе с нужными кутэшными либами.
1) Либо скомпилировать под ARM прямо из исходников (qt-everywhere-opensource-src-5.7.0.tar.gz). Как-то странно, не могу найти описание этого процесса, а в инете только старые статьи либо готовые скрипты, которые мне не подходят
2) Либо (если это возможно), установить Debian ARM (Wheezy) при помощи qemu-arm/chroot. Не уверен насколько это реально, хотя тупо Debian в qemu-arm-system устанавливал ранее
а просто скачать дебиановские пакеты для arm архитектуры, не?
Нет, туда нельзя установить программы и пакеты, но можно подсунуть SD-карту с программой (это работает), только хочется чтобы она была с Qt.
ну так достать файлы библиотек из пакетов можно же
да и кросскомпилить не так сложно по идее, запускаешь ./configure —help и смотришь, чего там нужно указать в параметрах
т.е. можно собрать Qt 5.7 для ARM просто подсунув какие-то параметры?
а статически слинковать не получится?
Так мне пока не на чем линковать, нет собранного Qt 5 для ARM.
в общем и целом да
ну с нюансами разными, типа установить нужный тулчейн, собрать под ARM все нужные зависимости для Qt и т.д.
кросскомпилить не так сложно по идее, запускаешь ./configure —help и смотришь, чего там нужно указать в параметрах
ну с нюансами разными, типа установить нужный тулчейн, собрать под ARM все нужные зависимости для Qt и т.д.
Для того и тема создана. А может можно готовый Qt 5.7 для ARM взять, но где и как его запускать? Я только в OpenEmbedded пробовал Qt5/ARM — там система+Qt5+программа вместе собирались.
А может можно готовый Qt 5.7 для ARM взять, но где и как его запускать?
Qt — это фреймворк, набор библиотек, запускать надо программу, которая с Qt линкуется
Где взять собранный Qt5 с его qmake в комплекте? Просто может есть способ развернуть Debian ARM в chroot + qemu-arm? т.е. не в виртуальной машине, а именно чтобы вывалить готовую ARM-систему с нужными зависимостями и запускать лишь qmake пр помощи qemu-arm?
в репозиториях дебиана, я ж говорил уже
Хорошо, скачаю я пакеты с расширением _armhf.deb, распаковал, запускать я их как буду?
Ты это делал сам, если советуешь?
Вот есть дока https://wiki.debian.org/QemuUserEmulation — мне кажется это ближе к реальности.
Поясню: я создал тему, чтобы спросить тех, кто реально это уже делал и знает путь, а не просто предположения.
зачем тебе их запускать?
своё приложение тоже можно кросскомпилировать, указав пути к arm библиотекам
Я понял что тебя удивляет. Да, я могу распаковать эти библиотеки с Qt 5 из репозитория Debian, да я могу их подсунуть прямо в каталог программы, но. программы то нет еще, есть исходники программы на Qt 5, но ее еще надо собрать под Qt5/ARM!
В общем, похоже я сам во всем почти разобрался: http://h-wrt.com/en/mini-how-to/debian — статья не без ошибок (mount devpts и вторую команду делать не надо, а каталога debian7 не существует), но в целом команды верные.
Вот что мне надо было, так я на своем x86_64 компе смогу собрать программу под Qt5/arm и затем засунуть в устройство.
Поищи мануал кросс компиляции для распбери. Я по нему собирал qt5 для cubietruck. Там надо будет поправить хидеры для своей платформы, я за пример брал от какой-то beaglebone. В целом, ничего сложного.
но ее еще надо собрать под Qt5/ARM!
ну так собирай, кто мешает 🙂
Хорошо, но конкретику бы. т.е. образно говоря я (например в Qt Creator) смогу указать компилер arm-g++ и путь к либам (выкачаным из Debian ARM репозитория)? А qmake я от кого брать буду? Он-то x86-ой должен быть.
В общем, твой вариант без примера не кажется рабочим, либо я что-то не понял. Пока что пробую через Debian ARM chroot по ссылке выше.
Я в этих ваших эмбедах не шарю, но когда компилял под RPI — помогло это. https://wiki.qt.io/Raspberry_Pi_Beginners_Guide Как бы как раз сборка из исходников для ARM, но может есть ещё тонкостей, да.
т.е. образно говоря я (например в Qt Creator) смогу указать компилер arm-g++ и путь к либам?
А qmake я от кого брать буду? Он-то x86-ой должен быть.
хостовый, под x86. В конце концов его использовать необязательно, есть более заточенные под кросскомпиляцию системы сборки (Autotools)
И да — ЕМНИП, qmake для текущей архитектуры собирался на одном из шагов, но могу ошибаться.
Ааааа, вот оно что, понял. Не знал что так можно, поэтому не воспринимал твои советы, прошу прощения.
Взять хостовый qmake и подсунуть ему Qt5 либы от Debian/ARM и задействовать arm-g++ кросскомпилятор? Но я боюсь оно что-то базовое еще понянет, и это дает мне chroot с Debian/arm.
В простейшем виде тебе нужна кросс-компиляция. То есть тулчейн, который будет запускаться на хостовой системе (x86_64) и выдавать из исходников бинарники целевой платформы (arm). Это, что касается компилятора, что касается линковки — для этого нужны библиотеки целевой архитектуры (arm) для тулчейна (ему в общем случае указывается -isystem параметр, указывающий на место где лежат целевые библиотеки). Сюда же включаются и библиотеки Qt.
По практике, нужно иметь готовую сборку qt-everywhere или собрать самому, с указанием, где лежит компилятор и прочие плюшки. Потом в qtcreator достаточно указать qmake, остальное он подтянет сам, т.к. все необходимые параметры ты укажешь при сборке qt-everywhere. Ну или возьмешь готовую собранную версию qt, которая будет знать где и что лежит.
Всё таки chroot с Debian/armhf оказался самым разумным и простым вариантом.
Источник