Кіріспе
Бұл мақалада біз динамикалық түрде жасалған қолданбаңыз үшін барлық qt тәуелділіктерін қалай дұрыс құру керектігін қарастырамыз.
Алдымен, кішкене теория.
Бұл не үшін қажет?
Қосымшаларды құрудың бірнеше жолы бар, олардың негізгілері:
Статикалық жинақ.
Статикалық құрастыру екілік жүйені құруды қамтиды, ол оған барлық қажетті сілтемелерді қамтиды. Басқаша айтқанда, оның жұмысына қажеттінің бәрі болады. Бұл тәсіл тәуелділігі аз шағын консольдық қолданбалар үшін қолайлы, әйтпесе соңғы екілік файлдың өлшемі өте үлкен болады.Динамикалық құрастыру.
Оның статикалықтан айырмашылығы, екілік файлда қолданбаның бастапқы коды ғана болады (екілік файлдың өлшемі минималды болады), бірақ мұндай қолданбаны іске қосқан кезде ол жазу кезінде пайдаланылған үшінші тарап кітапханаларын қажет етеді. ол.
Енді кішкене сипаттама.
Console-QtDeployer — windeployqt және macdeployqt сияқты қарапайым қызметтік бағдарлама. 5/osx-deployment.html). Бірақ аналогтардан айырмашылығы, ол әлдеқайда икемді интерфейске (іске қосу жалаушалары) және жоғары жылдамдыққа ие, сонымен қатар ол 2 платформаны қолдайды windows және linux, яғни қазір біз Linux және керісінше терезелер үшін тәуелділіктерді құра аламыз.
Мысал келтірейік.
Мысалы, qml - MyApp көмегімен қарапайым qt қосымшасын жаздым.
Менің қолданбам (main.cpp)
#include <QGuiApplication> #include <QQmlApplicationEngine> int main (int argc, char * argv []) { QCoreApplication :: setAttribute (Qt :: AA_EnableHighDpiScaling); QGuiApplication app (argc, argv); QQmlApplicationEngine engine; engine.load (QUrl (QStringLiteral ("qrc: /main.qml"))); if (engine.rootObjects (). isEmpty ()) return -1; return app.exec (); }
Менің қолданбам (main.qml)
import QtQuick 2.9 import QtQuick.Controls 2.2 ApplicationWindow { visible: true width: 640 height: 480 title: qsTr ("Scroll") ScrollView { anchors.fill: parent ListView { width: parent.width model: 20 delegate: ItemDelegate { text: "Item" + (index + 1) width: parent.width } } } }
MyApp динамикалық түрде қосылған, яғни жұмыс істеу үшін qt кітапханалары қажет.
Егер біз қолданбаны іске қосуға тырыссақ, құрастырудан кейін бірден қате пайда болады:
~/build-MyApp-Desktop_Qt_5_11_1_GCC_64bit4-Release $ ./MyApp ./MyApp: /usr/lib/x86_64-linux-gnu/libQt5Qml.so.5: version `Qt_5 'not found (required by ./MyApp) ./MyApp: /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5: version `Qt_5 'not found (required by ./MyApp) ./MyApp: /usr/lib/x86_64-linux-gnu/libQt5Core.so.5: version `Qt_5.11 'not found (required by ./MyApp) ./MyApp: /usr/lib/x86_64-linux-gnu/libQt5Core.so.5: version `Qt_5 'not found (required by ./MyApp)
Ұқсас мәтіндерден біз қолданбаның qt және qml графикалық кітапханаларына тәуелді екенін көреміз. Барлық ресурстарды (кітапханалар мен плагиндер) табу және құру көп уақытты алады.
Уақыт пен күш-жігерді үнемдеу үшін біз CQtDeployer утилитасын қолданамыз (оны
мына жерден жүктеп алуға болады
)
немесе Snap Store дүкенінде орнатыңыз
cqtdeployer -bin myApp -qmake /media/D/Qt/5.12.3/gcc_64/bin/qmake -qmlDir ./
Осы пәрменді орындағаннан кейін сіз қолданбаңыздың барлық Linux машиналарында жұмыс істеуі үшін барлық қажетті орталарды орнататын дайын іске қосқышпен жұмыс істеуге толығымен дайын қолданбаны аласыз.
Жалпы
QtDeployer Console іске қосылғаннан кейін қолданбаңыз бар қалтаның мазмұны келесідей болуы керек:
drwxr-xr-x 7 andrei andrei 4096 May 24 12:22 ./ drwxrwxr-x 3 andrei andrei 4096 May 24 12:22 ../ drwxr-xr-x 2 andrei andrei 4096 May 24 12:22 bin/ drwxr-xr-x 2 andrei andrei 4096 May 24 12:22 lib/ -rwx---rwx 1 andrei andrei 433 May 24 12:22 myApp.sh* drwxr-xr-x 6 andrei andrei 4096 May 24 12:22 plugins/ drwxr-xr-x 5 andrei andrei 4096 May 24 12:22 qml/ drwxr-xr-x 2 andrei andrei 4096 May 24 12:22 translations/
- myApp.sh - қолданбаны іске қосу үшін сценарий
- bin - екілік файлы бар қалта
- lib - қолданбаның барлық қажетті тәуелділіктері бар қалта.
- плагиндер - қолданба жұмыс істеуі үшін қажет qt плагиндері
- qml - qml тәуелділіктері.
- аудармалар – стандартты qt аудармалары.
Осылайша, сіз өзіңіздің өтініміңізді deb немесе snap пакетіне орау үшін дайындай аласыз, содан кейін оны таратуды бастай аласыз. cqtdeployer іске қосқаннан кейін қолданбаңыз үшін қажетті ортаны орнататын sh сценарийі арқылы қолданбаны іске қосу керек екенін ескеріңіз.
Напишите прожалуйста пример запуска для Windows :-)
отбой Разобрался.... После линуха сложно :-)
Возможно кому то пригодится
сqtdeployer для windows работает точно так же как и для Linux
разница лишь в команде запуска
Подробная инструкция использования под Windows:
Вот моя строка по которой все отлично сработало
написал приложение, холоворд на qt виджетах, без qml. Из визарда QtCreator. Собрал кросскомпилятором. Нужно перенести на таргет.
juvf@juvf-VirtualBox:~/qtWs/test/imx6/release$ ~/CQtDeployer/1.5/cqtdeployer.sh -bin test -qmake ~/soft/juvfTool/arm-buildroot-linux-gnueabihf/sysroot/home/juvf/tools/imx6/qt5_15_2_J/bin/qmake -qmlDir ./
Info: Deploy ...
Info: The targetDir option is not used. CQtDeployer will use default target dir :/home/juvf/qtWs/test/imx6/release/DistributionKit
Info: copy :/home/juvf/qtWs/test/imx6/release/test
Warning: Failed to extract qml! The qt qml dir is not initialized!
Warning: Failed to copy standard Qt translations
Info: deploy done!
Info: copy :/home/juvf/qtWs/test/imx6/release/DistributionKit/tmp_data/Application/bin/qt.conf
Info: copy :/home/juvf/qtWs/test/imx6/release/DistributionKit/tmp_data/Application/bin/test
Info: copy :/home/juvf/qtWs/test/imx6/release/DistributionKit/tmp_data/Application/test.sh
juvf@juvf-VirtualBox:~/qtWs/test/imx6/release$
после имею ТОЛЬКО скрипт test.sh и папку bin в которой два файла: само приложение test и файл qt.conf. Всё! Ни паки lib, ни plugin
перенёс всё на таргет. запускаю скриптом
./test.sh
/opt/argo/bin/test: error while loading shared libraries: libQt5Widgets.so.5: cannot open shared object file: No such file or directory
ну кагбэ неудевительно, что не может найти libQt5Widgets.so.5. Удевительно, что cqtdeployer не подтянул ни библиотеки, ни плагиины