mafulechka
mafulechka06 травня 2020 р. 04:36

Складання Docker з QtCreator

На своєму комп'ютері для розробок натискаєте Ctrl+R (Run (Виконати)) у QtCreator, щоб створити та запустити вашу програму Qt. Якщо ви хочете запустити програму у вбудованій системі, то ви повинні виконати чотири завдання:

• Створюйте крос-додаток Qt для цільової вбудованої системи в контейнері Docker.
• Зупиняєте програму в цільовій системі.
• Копіюєте програму з ПК розробника до цільової системи за допомогою scp.
• Запускаєте програму в цільовій системі.

Чи хотіли б ви натиснути Ctrl+R у QtCreator і змусити QtCreator виконати для вас чотири вищезгадані кроки? Звісно, хотіли! У цій статті буде розказано, як це зробити. Запуск програми у вбудованій системі буде аналогічним запуску програми на ПК.


Налаштування

Промислові термінали (наприклад, комп'ютерні дисплеї) запускають програми для моніторингу та керування машинами. Вони часто працюють на процесорах Intel або AMD з x86_64 архітектурою. Ubuntu – досить природний вибір для операційної системи. Користувальницький інтерфейс Ubuntu на робочому столі може бути вимкнений, оскільки термінал запускає лише основну програму, і може бути одним або двома допоміжними програмами.

Налаштувати середовище розробки для промислових терміналів досить легко. Ваш ПК працює під керуванням якоїсь версії Ubuntu (у розробника встановлено: Ubuntu 16.04). Цільова система працює на іншій версії Ubuntu (розробник: Ubuntu 18.04). Крос-складальне середовище в контейнері Docker - це не що інше, як середовище Ubuntu 18.04 з усіма пакетами, встановленими для збирання бібліотек Qt та програми.

Вам навіть не потрібен термінал, виготовлений на замовлення. Вам потрібні лише два ПК з Linux, які підключені через (W)LAN та можуть обмінюватися даними через OpenSSH один з одним.

Якщо цільова система працює на ARM SoC, налаштування середовища крос-складання в контейнері Docker буде трохи складнішим. Ви повинні зібрати Qt SDK (наприклад, шляхом створення meta-toolchain-qt5 мети Yocto (target) ) та встановити Qt SDK у контейнер Docker. Контейнер приховує середовище крос-складання від QtCreator. QtCreator не знає, чи контейнер крос-компілятор для цілей ARM або власний компілятор для цілей Intel.

Якщо ви хочете наслідувати приклад проекту або власний проект, повинні бути виконані наступні попередні умови.

Ви встановлюєте Docker на комп'ютер для розробки, як описано тут.

Ви створюєте робочий каталог (для розробника: /public/Work ) на своєму комп'ютері для розробки. Ви клонуєте репозиторій із прикладом проекту чи вашого проекту у робочий каталог.

$ cd /public/Work
$ git clone https://github.com/bstubert/qtcreator-with-docker.git
$ cd qtcreator-with-docker

Каталог проекту містить Dockerfile. Встановіть WORKDIR в останній рядок вашого робочого каталогу. Це важливо, як ви побачите у наступних розділах. Для розробника останній рядок виглядає так:

WORKDIR /public/Work

Потім ви дотримуєтеся цього опису для створення образу Docker qt-ubuntu-18.04-ryzen і використовуєте цей образ для складання бібліотек Qt, що переміщуються (Qt 5.14 або новіше). Складання Qt дає вам tarball qt-5.14.1-ubuntu-18.04-ryzen.tgz , який ви розпаковуєте в робочому каталозі.

$ cd /public/Work
$ tar xf /path/to/qt-5.14.1-ubuntu-18.04-ryzen.tgz

Розпакування встановлює бібліотеки Qt у каталог /public/Work/qt-5.14.1 .

У вас є працююче з'єднання OpenSSH між вашим ПК та цільовою системою. Аутентифікація за паролем працює нормально.

Docker Wrapper для CMake

Коли ви збираєте та встановлюєте програму Qt, QtCreator викликає CMake:

• створити Makefiles (Make-файли). Це викликає:
cmake /public/Work/qtcreator-with-docker '-GCodeBlocks - Unix Makefiles '
у тимчасовому каталозі, наприклад /tmp/QtCreator-jZQYdh/qtc-cmake-caIYzSxO .
• скомпілювати та зв'язати програму Qt. Це викликає:
cmake --build. --ціль на всіх
у каталозі збірки, наприклад /public/Work/build-RelocatableQt-Qt_5_14_1-Debug .
• встановити Qt та його допоміжні файли. Це викликає:
cmake --build. --target install
у каталозі складання.

Ідея полягає в тому, щоб викликати CMake усередині контейнера Docker. Перш ніж QtCreator викликає CMake, він переключається до певного каталогу на комп'ютері розробника або хосту. Цей каталог повинен бути переданий контейнеру, щоб CMake можна було викликати у потрібному місці усередині контейнера. Сценарій оболонки CMake dr-cmake робить наступне.

#!/bin/bash
docker run --rm -v /public/Work:/public/Work -v/tmp:/tmp -w $(pwd) qt-ubuntu-18.04-ryzen cmake $@

Опції -v /public/Work:/public/Work та -v/tmp:/tmp відображають дерево робочого та тимчасового каталогу від хоста до контейнера. Опція w $ (pwd) передає каталог хоста, де QtCreator викликає CMake, як поточний робочий каталог контейнер Docker. Docker запускає cmake з аргументами $@, переданими у скрипт dr-cmak e.

Сценарій dr-cmake переводить дії QtCreator на хост-комп'ютер у ті самі дії у контейнері Docker. Цей переклад працює лише тому, що хост-комп'ютер та контейнер Docker мають однакову структуру каталогів.

Скопіюйте скрипт-обгортку dr-cmake у каталог, що міститься в $PATH (eg ~/bin) , і переконайтеся, що скрипт виконується.

SSH-доступ до цільової системи (Target System)

QtCreator використовує OpenSSH для копіювання файлів із ПК розробника в цільову систему. Отже, OpenSSH має бути встановлений як у вашому комп'ютері, і на цільовому комп'ютері. QtCreator не працює з Dropbear, полегшеною альтернативою OpenSSH для вбудованих систем.

Для входу в SSH QtCreator пропонує аутентифікацію за паролем та аутентифікацію з відкритим ключем. Аутентифікація за паролем вимагає, щоб ви вводили пароль щоразу, коли розгортаєте програму в цільовій системі. Це швидко стає стомлюючим. Отже, ви хочете використовувати аутентифікацію з відкритим ключем.

Для цього ви створюєте закриті (private) та відкриті (public) ключі на своєму ПК за допомогою ssh-keygen .

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/burkhard/.ssh/id_rsa): /home/burkhard/.ssh/touch21-id_rsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/burkhard/.ssh/touch21-id_rsa.
Your public key has been saved in /home/burkhard/.ssh/touch21-id_rsa.pub.
...

Ви залишаєте парольну фразу порожньою, натискаючи Return і повідомляє агента SSH про новий ключ.

$ ssh-add ~/.ssh/touch21-id_rsa

Копіюєте відкритий (public) ключ у цільову систему.

$ scp ~/.ssh/touch21-id_rsa.pub benutzer@192.168.1.82:/home/benutzer/.ssh

Замінюєте benutzer та 192.168.1.82 з IP-адресою цільової системи своїм ім'ям користувача в цільовій системі.

Увійдіть у цільову систему та додаєте відкритий ключ у файл ~/.ssh/authorized_keys .

On host:
$ ssh benutzer@192.168.1.82
=> Enter your password

On target:
# cat ~/.ssh/touch21-id_rsa.pub > ~/.ssh/authorized_keys

При наступному вході в цільову систему вам не потрібно буде вводити пароль. SSH перевіряє, чи має користувач, що виконує вхід, закритий ключ одного з відкритих ключів, що зберігаються в ~/.ssh/authorized_keys . QtCreator використовуватиме той самий механізм для розгортання файлів програми.

Створення Docker Qt Kit

Вам потрібно визначити набір, який використовує сценарій dr-cmake замість cmake і знає, як увійти до цільової системи за допомогою SSH, розгортає файли програми та бібліотеки Qt у цільовій системі.

Налаштування: CMake

Відкрийте діалогове вікно Tools > Options > Kits > CMake (Інструменти > Установки > Комплекти > CMake) та натисніть кнопку Додати. Заповніть поля, як показано на скріншоті, і натисніть Apply (Застосувати) .

Налаштування: версія Qt

Перейдіть до однорівневого діалогу Tools > Options > Kits > Qt Versions (Інструменти > Параметри > Комплекти > Версії Qt) та натисніть кнопку Add (Додати) . Перейдіть до двійкового файлу QMake версії Qt, яку ви встановили у своєму робочому каталозі. Наприклад, QMake розробника знаходиться за адресою /public/Work/qt-5.14.1/bin/qmake . Додайте префікс Version name with Docker (ім'я версії в Docker ), щоб цю версію Qt було легко розпізнати. Натисніть кнопку Apply (Застосувати) , щоб зберегти конфігурацію.

Налаштування: пристрій

Перейдіть до діалогу Tools > Options > Devices (Інструменти > Установки > Пристрої) , щоб додати інформацію для входу до SSH. На вкладці Devices натисніть Add (Додати) , виберіть Generic Linux Device в окремому діалоговому вікні, яке випливає, і натисніть кнопку Start Wizard . Для розробника перша сторінка wizard виглядає так:

У вас будуть різні значення для імені, IP-адреси та імені користувача. Натисніть кнопку Next (Далі) , щоб перейти до другої сторінки wizard. Перейдіть до закритого ключа SSH, який ви створили раніше.

Оскільки ви вже розгорнули відкритий ключ, ви переходите на третю та останню сторінку wizard, натиснувши кнопку Next (Далі) . Остання сторінка виглядає так.

Натисніть кнопку Finish (Готово) . Діалог для успішного тестування підключення виглядає так.

Повністю заповнена форма для нового пристрою Touch21 виглядає приблизно так.

Налаштування: Комплект

Ви визначили всі частини: CMake, Qt Version та Device для налаштування Kit. Поверніться до діалогового вікна Tools > Options > Kits > Kits (Інструменти > Установки > Комплекти > Комплекти) та натисніть кнопку Add (Додати) . Заповніть форму, як показано на наступному скріншоті.

Натисніть Change (Змінити) для CMake Configuration внизу та замініть вміст діалогу на наступні три рядки.

CMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}
CMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}
CMAKE_PREFIX_PATH:STRING=/public/Work/qt-5.14.1

Не забудьте замінити робочий каталог розробника /public/Work вашим. Ось як повинен виглядати діалог, перш ніж натиснути кнопку OK .

Конфігурування проекту

Якщо ви відкриваєте файл проекту /public/Work/qtcreator-with-docker/CMakeLists.txt вперше, QtCreator попросить вас налаштувати проект (див. наступний знімок екрана). Виберіть набір Docker Qt 5.14.1, який ви створили, і натисніть кнопку Configure Project (Налаштувати проект) .

Якщо ви відкривали раніше проект з іншою конфігурацією, ви натискаєте на запис Docker Qt 5.14.1 у списку нижче Build & Run і на підпункт Build .

В обох випадках ви побачите типові повідомлення CMake на панелі виводу General Messages (Загальні повідомлення) при створенні Makefiles (Make-файлів) вперше. Подивіться на перший рядок: QtCreator викликає скрипт dr-cmake замість cmake . Контейнер Docker блокує з'єднання сокетів, яке намагається встановити сервер CMake option-E. Це викликає повідомлення про помилки QLocalSocket::connectToServer: Invalid name . Тим не менш, виклик CMake працює.

Running "/home/burkhard/bin/dr-cmake -E server --pipe=/tmp/cmake-.JRorEM/socket --experimental" 
    in /tmp/QtCreator-jZQYdh/qtc-cmake-cbJJnSrf.
QLocalSocket::connectToServer: Invalid name
...
Starting to parse CMake project, using: 
    "-DCMAKE_BUILD_TYPE:STRING=Debug", 
    "-DCMAKE_CXX_COMPILER:STRING=/usr/bin/g++", 
    "-DCMAKE_C_COMPILER:STRING=/usr/bin/gcc", 
    "-DCMAKE_PREFIX_PATH:STRING=/public/Work/qt-5.14.1".
The C compiler identification is GNU 7.4.0
The CXX compiler identification is GNU 7.4.0
...
Check for working CXX compiler: /usr/bin/g++
Check for working CXX compiler: /usr/bin/g++ -- works
Detecting CXX compiler ABI info
Detecting CXX compiler ABI info - done
Detecting CXX compile features
Detecting CXX compile features - done
Configuring done
Generating done
CMake Project was parsed successfully.

Відкрийте налаштування збірки Projects > Build & Run > Docker Qt 5.14.1 > Build і натисніть Add Build Step > Build . Перевірте налаштування (install) у полі Targets (Цілі) та зніміть усі інші цілі. Наступний знімок екрана показує остаточні налаштування збирання. Зверніть увагу, що dr-cmake використовується на етапах збирання та очищення замість cmake .

Перейдіть на налаштування запуску Projects > Build & Run > Docker Qt 5.14.1 > Run . Видаліть розділ Install (Установка) у temporary host directory (тимчасову директорію хоста) , навівши курсор на кнопку Details (Подробиці) та натиснувши на хрестик ліворуч від кнопки Details. Решта ж розділу розгортання гаразд.

Коли ви збудуєте проект хоча б один раз, ви побачите все Files to deploy (файли для розгортання) у вікні з тим же ім'ям. Список файлів повідомляє QtCreator, які віддалені каталоги він повинен копіювати локальні файли при розгортанні. Ось приклад запису:

/public/Work/qt-5.14.1/lib/libQt5Multimedia.so.5.14.1
    -> /home/benutzer/MyComp/qt/lib/

QtCreator читає відображення з локальних файлів у віддалені каталоги файлу QtCreatorDeployment.txt . Макроси add_deployment_file і add_deployment_directory заносять записи зіставлення в QtCreatorDeployment.txt .

Відображення містить два записи для файлу програми, що виконується.

/public/Work/build-qtcreator-with-docker-Docker_Qt_5_14_1-Debug/final/bin/SimpleApp
    -> /home/benutzer/MyComp/bin
/public/Work/build-qtcreator-with-docker-Docker_Qt_5_14_1-Debug/SimpleApp
    -> /home/benutzer/MyComp/.

Другий запис походить від дзвінка install(TARGETS). Виконуваний файл є результатом кроку збирання CMake. Він містить послідовність двокрапок замість rpath. Він не працюватиме в цільовій системі, тому що не знайде бібліотеки Qt. Крок установки CMake замінює послідовність двокрапок відносними rpaths. Результатом кроку установки є файл першого запису, що виконується, який випливає з виклику add_deployment_file. Виконуваний файл першого запису - це той, який QtCreator запускатиме в цільовій системі.

Якщо ви використовуєте QtCreator 4.11.0 або новіші та CMake 3.14 або новіші, вам більше не знадобиться обхідний шлях з файлом QtCreatorDeployment.txt . QtCreator та CMake працюють разом, щоб створити відображення з команд установки. Тим не менш, Ubuntu 18.04 поставляється з CMake 3.10, тому вам все ще потрібний обхідний шлях.

У розділі Run (Запуск) у Run configuration (конфігурації запуску) має бути зазначено SimpleApp (on Touch21) . У полі під Run configuration введіть такі значення.

• У рядку Alternate executable on device (Альтернативний файл, що виконується на пристрої) встановіть прапорець Use this command instead (Використовувати цю команду) і введіть повний шлях до виконуваного файлу на цільовому пристрої (для розробника: /home/benutzer/My /bin/SimpleApp) .
• У рядку Command line arguments (Аргументи командного рядка) введіть аргументи, необхідні для програми (для розробника: -platform xcb -plugin evdevtouch) .

У розділі Run Environment (запуск середовища виконання) ви додаєте змінну DISPLAY зі значенням: 0.

Запуск програми в цільовій системі

Тепер настає чарівний момент. Ви натискаєте Ctrl+R (Run) у QtCreator. QtCreator створює програму, розгортає програму та бібліотеки Qt на цільовому пристрої, і запускає його на цільовому пристрої. Усе це за крок.
Ви бачите виклики QtCreator Docker-CMake та виклики розгортання на Compile Output pane (панель Компілювати висновок) . Ось скорочена версія (за винятком повідомлень компілятора та прогресу).

11:19:37: Running steps for project SimpleApp...
11:19:37: Persisting CMake state...
11:19:37: Starting: "/home/burkhard/bin/dr-cmake" --build . --target all
...
11:19:39: The process "/home/burkhard/bin/dr-cmake" exited normally.
11:19:39: Starting: "/home/burkhard/bin/dr-cmake" --build . --target install
...
11:19:43: The process "/home/burkhard/bin/dr-cmake" exited normally.
11:19:43: Connecting to device "Touch21" (192.168.1.82).
11:19:44: The remote file system has 985 megabytes of free space, going ahead.
11:19:44: Deploy step finished.
11:19:44: Trying to kill "/home/benutzer/MyComp/bin/SimpleApp" on remote device...
11:19:45: Remote application killed.
11:19:45: Deploy step finished.
11:19:45: sending incremental file list

11:19:45: SimpleApp
...
total size is 751,048  speedup is 1.00

11:22:24: Deploy step finished.
11:22:24: Elapsed time: 02:47.

Перше розгортання займає пару хвилин (у розробника зайняло 2:47 хвилин), тому що QtCreator копіює час виконання Qt з ПК розробника в цільову систему. Поки Qt не змінюється, можна пропустити розгортання Qt. Перейдіть до параметрів збирання Projects > Build & Run > Docker Qt 5.14.1 > Build , встановіть для змінної DEPLOY_QT значення OFF у розділі CMake і натисніть кнопку Apply Configuration Changes .
Тепер ваш робочий процес такий самий, як коли б ви запускали додаток на своєму ПК для розробки. Ви змінюєте свій код і створюєте, розгортаєте та запускаєте програму, натискаючи Ctrl+R у Qt Creator, а потім ви можете спробувати свої зміни в цільовій системі. Ви негайно отримуєте зворотний зв'язок про те, як ваші зміни поводяться у цільовій системі.

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
d
  • dsfs
  • 26 квітня 2024 р. 04:56

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80бали,
  • Рейтинг балів4
d
  • dsfs
  • 26 квітня 2024 р. 04:45

C++ - Тест 002. Константы

  • Результат:50бали,
  • Рейтинг балів-4
d
  • dsfs
  • 26 квітня 2024 р. 04:35

C++ - Тест 001. Первая программа и типы данных

  • Результат:73бали,
  • Рейтинг балів1
Останні коментарі
k
kmssr08 лютого 2024 р. 18:43
Qt Linux - Урок 001. Автозапуск програми Qt під Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий Кононенко05 лютого 2024 р. 01:50
Qt WinAPI - Урок 007. Робота з ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25 грудня 2023 р. 10:30
Boost - статичне зв&#39;язування в проекті CMake під Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
J
JonnyJo25 грудня 2023 р. 08:38
Boost - статичне зв&#39;язування в проекті CMake під Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
G
Gvozdik18 грудня 2023 р. 21:01
Qt/C++ - Урок 056. Підключення бібліотеки Boost в Qt для компіляторів MinGW і MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
Тепер обговоріть на форумі
Evgenii Legotckoi
Evgenii Legotckoi02 травня 2024 р. 14:07
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.
IscanderChe
IscanderChe30 квітня 2024 р. 04:22
Во Flask рендер шаблона не передаётся в браузер Доброе утро! Имеется вот такой шаблон: <!doctype html><html> <head> <title>{{ title }}</title> <link rel="stylesheet" href="{{ url_…
G
Gar22 квітня 2024 р. 05:46
Clipboard Как скопировать окно целиком в clipb?
Павел Дорофеев
Павел Дорофеев14 квітня 2024 р. 02:35
QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
f
fastrex04 квітня 2024 р. 04:47
Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…

Слідкуйте за нами в соціальних мережах