Ерте ме, кеш пе, кез келген Qt әзірлеушісі өз қолданбасын басқа компьютерлерге көшіру қажеттілігіне тап болады, содан кейін мақсатты компьютерде қолданбаның іске қосылуы және жұмыс істеуі үшін қажетті кітапханалардың болуы мәселесі туындайды. Бұл әсіресе Windows операциялық жүйесінде орындалуы керек қолданбаны тасымалдау кезінде байқалуы мүмкін. Егер Linux жүйесінде қажетті Qt кітапханалары әдепкі бойынша болуы мүмкін болса, мысалы Ubuntu сияқты, Windows жүйесінде олар мүлде болмауы мүмкін.
Бірақ барлық қажетті кітапханаларды табу және құру жаңадан бастаушы үшін қиын тапсырма, ал тәжірибелі бағдарламашы үшін өте жалықтыратын тапсырма болуы мүмкін. Бірақ мұнда да қайырымды адамдардың арқасында шешімі бар. Бұл DLL Collector. утилитасы.Бұл қызметтік бағдарлама Qt шеңберінде жазылған бағдарламаның тәуелділіктерін алуға және кітапхана деректерін автоматты түрде көрсетілген қалтаға көшіруге мүмкіндік береді.
Автор жазғандай, утилита процестің орындалу уақытында тәуелділіктерді іздейді. Сондықтан сіздің бағдарламаңыз осы утилита арқылы іске қосылуы керек. DLL Коллектор сіздің бағдарламаңыз пайдаланатын барлық жүктелетін плагиндер туралы ақпаратты жинайды, бірақ плагиндер бағдарламаңыздың функцияларымен бірінші рет пайдаланылған кезде жүктелетінін ұмытпаңыз. Осылайша, DLL Коллектор барлық кітапханаларды табуы үшін бағдарламаңызды оның функционалдығы арқылы іске қосу қажет.
DLL коллекторы қалай жұмыс істейді
Бірінші қадам. Утилитаны орнату
Бұл қадамда келесі әрекеттерді орындау керек:
- name өрісінде құрастырылған программаның жолын көрсетіңіз;
- bin өрісінде Qt кітапханаларының екілік файлдарына жолды көрсетіңіз;
- plugins өрісінде Qt плагиндеріне жолды көрсетіңіз;
- DLL кітапханалары көшірілетін қалтаға жолды көрсетіңіз
- қоршаған ортаға себетті қосу жанындағы құсбелгіні қойыңыз.
Екінші қадам. Қолданбаны іске қосу
Конфигурациялау аяқталғаннан кейін Run. түймесін басу арқылы қолданбаны іске қосыңыз
Үшінші қадам. Плагиндер мен кітапханалар тізімін жаңарту
Қолданбаңыз іске қосылғаннан кейін Жаңарту түймесін басыңыз. Плагиндер мен кітапханалар тізімі көрсетіледі. Сондай-ақ DLL Collector барлық тәуелділіктерді тапқанына көз жеткізу үшін қолданбаңызбен біраз ойнаңыз және барлық тәуелділіктердің табылғанына көз жеткізу үшін Жаңарту түймесін бірнеше рет басыңыз.
Төртінші қадам. Кітапханаларды көшіру
Кітапханалар табылғаннан кейін Көшіру, түймесін басыңыз, сонда барлық кітапханалар көшіріледі.
Түйіндеме
Қорытындылай келе, утилита өте пайдалы және өмірді айтарлықтай жеңілдетеді деп айта аламын.
Мақаланы жазу кезінде Автор бағдарламаның жаңа нұсқасын орналастырды, бірақ ол мен үшін сәтсіздікке ұшырады. Сондықтан мен әлі де ескі нұсқаны пайдаланып жатырмын, оны мына жерден жүктеп алуға болады: DLLCollector
Сондай-ақ, бағдарламамен Автордың бетте таныса аласыз.
Сондай-ақ қолданбаңыз үшін орнатушыны жасауды ұмытпаңыз және оны қалай жасау керектігін келесі мақаладан үйреніңіз.
Не работает http://screenshot.ru/upload/image/S0sb
Старой или последней версией пользуетесь? В статье по ссылке есть более старая версия. Она работала лучше, чем последняя версия. К сожалению, не могу проверить работоспособность утилиты, поскольку не имею ни одной установки Windows на данный момент.
Старая не работает с компиляторами msvc , попросту ничерта не находит , новая с ними же выдаёт ошибку при нажатии updаte , обе версии работают с mingw , однако старая нашла 51 модуль , новая 45. И обе игнорят целый пакет библиотек от MS VS . В общем , подскажите аналогичную программу , может тогда всё нормально станет.
Есть ещё Dependency Walker. Сам не использовал, но часто натыкался на форумах, что его советуют для поиска DLL-ок.
Вероятно по тому что Вы пытаетесь использовать сборщик x32 для сборки Qt x64.
Стоило скачать исходники сборщика и перекомпилить.
Dependency Walker не справляет с этой задачей он не видит плагинов.
Если использовать, то использовать ProcessExplorer которыей в принципе должен отображать то же что и мои сборщик.
Кстати программу я давно обновил, если есть замечания по работе пишите в мой лучше в блог.
Добрый день!
Добрый день!
У меня нет возможности собрать под x32.
Кроме того если человек до сих по не научился нажимать кнопочку "собрать" проект, то ему лучше вообще не заниматься программированием.
И почему только для новичков?
Профи программистами не нужно собирать ддлки в кучу?
Касательно windeployqt:
1. Cобирает не все.
2. Cобирает то что вообще не нужно, порой такое впечатление что он тупо копирует все подряд.
3. Ну и как понимаю он не анализирует зависимости от сторонних библиотек.
Поправка: У меня нет возможности собрать под x64.
Да и я еще планирую поддерживать сборку под Linux.
Но по в связи с внесением изменений она не работает.
К сожалению, ваша программа работает только в рантайме,
А сторонние либы идут предкомпилированные в репозитории и собираются через qmake в общий билд.
Моя программа работает в рантайме ибо нет другого способа узнать все зависимости.
Ну с таким успехом можно тупо копирнуть папку QtDIRКак что от чего зависит внутри Qt могут знать только разработчики Qt.
Но то что windeployqt работает криво говорит от том что и у них проблемы с пониманием.
Я уже не говорю о той фигне которую они придумали в последних версиях (вшитых хардкор путях).
И удалить все лишнее.
Получите где-то ~200 MБ это как и будет весь Qt комплект (а не 50M или 2ГБ)
А насколько часто Вы собираете деплой?
Это как бы делается в самом конце так что не должно быть частым.
Деплой делается при каждом коммите, каждой ветви, автоматически, чтобы тестировщики могли проводить тестирование проекта нон-стоп.
Под сборку выделен отдельный сервер. Помимо Qt используем Open Cascade, Wt::dbo, Boost и ещё ряд библиотек, так что Qt занимает лишь малую часть. Поэтому на выходе имеем 700 мб.
Так что... примерно 50-60 деплоев в день будет. Если не больше.
Согласен, это морока.
Качать каждый раз по 700M ...
Сомневаюсь что сам набор библиотек так часто меняться по крайней мере касающихся Qt
Да, набор библиотек часто не меняется, но отслеживать в рантайме... это не имеет смысла, проще раз написать скрипт, который будет собирать всё, что нужно и немного лишнего, но зато всё будет работать. Так и живём )) Поэтому и говорю, что пару лишних либ из Qt никто даже не заметит ))
Но ваша софтина замечательна для небольших проектов и при первом деплое, когда вообще непонятно, какой библиотеки не хватает и откуда её брать. Очень удобно.
Если будет время, я сделаю билд под x64 на работе. Я напишу, когда будет готово.
Это вообще лишено смысла, пусть тестировщик держит все либы у себя на компе, и подменяет только исполняемый файл. А деплоить только перед финальным выпуском.
Сам проект состоит примерно из 20-ти подпроектов и все билдится в библиотеки. Запускаемый файл весит 28кб, а собираемые библиотеки, которые были написаны в рамках проекта - остальные 300 мб.
Если бы всё собиралось в один исполняемый файл, то программисты бы очешуели ждать пересборку при каждом изменении кода.
Так что просто заменить исполняемый файл не канает
Ну сути это не меняет.
Нет смысла деплоить одно и тоже каждый раз.
Какая-то библиотека может быть изменена в рамках одной единственной ветви из более чем 200 веток, над которыми работают в текщий момент времени.
Предлагаете обучать каждого тестировщика отслеживать, изменилась ли какая-то из библиотек? Бред. Люди имеют свойство забывать и ошибаться. Автоматический скрипт подготовит все необходимые библиотеки и уложит в подготовленный полноценный пакет. Тестировщику нужно лишь знать, откуда скачать.
Библиотека Qt ?
Qt тоже. Там тоже хватает багов, которые мы исправляем.
Про главным образом Qt и шла речь,
Если правятся исходники Qt то согласен для этого случая иначе нельзя.
А при чём тут только один Qt? Ваша же программа собирает и другие зависимые библиотеки. А значит здесь не только Qt, помимо прочего я уже говорил про Wt::dbo, Boost, Open Casecade. Может быть User Story на обновление библиотеки или исправление какого-то бага в этой библиотеки. Зачем заниматься ручной работой и напоминать тестировщику, что если программист что-то исправил, то нужно заменить библиотеку? Есть для этого автоматический скрипт, который просто потратит немного процессорного времени на копирование. Этого гораздо менее накладно, чем нагружать людей лишней ручной работой.
По тому что LibraryCollector заточен конкретно именно под деплой Qt приложений.
Он видит другие зависимости но не делает из сборку
(да и откуда программе знать что нужно для Вашего специфичного проекта)
Пользователь должен сам найти в списке нужные библиотеки и чекнуть их что бы они скопировались(при чем будет тупое копирование в папку исп.файла).
В новой версии LibraryCollector можно добавить свои правила правкой js-скрипта что бы настроить сборку согласно специфике своего проекта и его библиотек.
(Например, если у Вас такая же муторная система плагинами с иерархией папок)
Или Вы хотите сказать что windeployqt видит зависимости от
?Нет, это я не хотел сказать (к сожалению это не так). Говорю о том, что Ваша программа отлично справляется со своей функцией и позволяет также найти недостающие сторонние библиотеки, но это может быть только разовая операция, чтобы разобраться с конкретной проблемой (ну не получается найти конкретную нужную версию (будем считать, что разработчик жёстко не выспался сегодня)), но в рамках автоматизации сборку Qt библиотек лучше положить на windeployqt, если только у вас не поддерживается консольный вариант работы (?), а сторонние бибилотеки держать в рамках репозитория и производить их копирование в итоговый билд. Чтобы просто не нагружать специалистов не нужной работой, а всю сборку просто поставить на поток через автоматизацию.
Но опять же... у вас зависимости ищутся в рантайме. Что также не получится автоматизировать... к сожалению...
Дело в том что искать сторонние библиотеки как правило не проблема, по тому что у сторонних библиотек как правило нет такое ерунды с плагинами которые подгружаются по мере необходимости.
В таких случаях достаточно проанализировать структуру PE файла (экзешника)
а точнее таблицу импорта (даже не нужно запускать процесс)
Вся проблема в плагинах Qt которые отслеживаются только в процессе и только после прогона по функционалу. Могу конечно предположить что есть библиотеки которые делают так же, но не могу привести примеры.
Консольный вариант можно легко допилить, но смысла мало ибо по любому нужен прогон программы по функционалу.
Кстати так советуемый на форумах Dependency Walker скорее всего так и делает- анализирует таблицу импорта - и видит только модули Qt, а плагины и qml пропускает.
Евгений, здравствуйте! Первое, что скажу - спасибо за ваш сайт и вашу работу.
Пользовался DLL Collector'ом для сбора библиотек, дальше только выпускал новые экзешники и менял ими старые, все работало. Но вот перестало: новый экзешник при запуске выдает ошибку, что не найдена библиотека qt5network.dll, добавил вручную, появилась новая ошибка "точка входа в процедуру ... не найдена в qt5core.dll". Тут я уже решил заново в коллекторе собрать все библиотеки, но он стал выдавать "Process started. Process crashed. Process finished". Где нужно искать ошибку, что исправлять?
Добрый день. Спасибо за отзыв.
Если честно, то я уже тут не подскажу. Я этой программкой уже так давно не пользовался и даже не знаю, что уважаемый Avazart (разработчик DLL Collectora) там менял.
Нужно больше информации что бы сказать что не так.
Версия Qt, версия компилятора. И вообще собираете последней версией моей программы?
И нельзя просто так менять одну dll. Нужно менять всё при смене версии.
Кроме того network часто тащит ssl библиотеки.
В последней версии я сделал так что можно писать js скрипт сценирий для распределения по группам сборки.
Т.е. по сути можно свои группы добавлять и прочие вещи под себя. Я подумал что такая гибкость будет кстати. Есть конечно и негативные стороны изменений - выполняется вроде как чуть дольше и я поломал сборку по Linux (но вроде как ей все равное никто не пользуется)
QT 4.11.0, MinGW 32bit 5.9.8
Ваша программа скачана по ссылке из статьи, не знаю, где там версию посмотреть. Собирал через windeployqt отдельно - то же самое, недоставало некоторых библиотек. Изначально для устранения ошибки качал недостающие библиотеки с просторов интернета, и это приводило к "точка входа в процедуру ... не найдена в qt5core.dll". Проблему решил добавлением библиотек из папки mingw53_32\bin.
PS: перепутал адресат, ответ Azavart'у
100% LibraryCollector увидил зависимости просто Вы их не "чекнули" в окне поэтому они не были добавленны. Для автоматического подхвата MinGW библиотек стоило js-скрипт поправить, по умолчанию там только msvc.
Добрый день. Вы писали, что под х64 нужно пересобрать проект, при сборке появляются ошибки типа
C:\SRC\LibraryCollector-lc_js\LibraryCollector-lc_js\wrappers\dir.cpp:149: ошибка: invalid conversion from 'QFlagsQDir::Filter::Int {aka int}' to 'Dir::Filter' [-fpermissive]
Dir::Filters filters_= (int)dir_.filter();
C:\SRC\LibraryCollector-lc_js\LibraryCollector-lc_js\wrappers\dir.cpp:155: ошибка: invalid conversion from 'QFlagsDir::Filter::Int {aka int}' to 'QDir::Filter' [-fpermissive]
QDir::Filters filter_= (int)filter;
C:\SRC\LibraryCollector-lc_js\LibraryCollector-lc_js\wrappers\dir.cpp:161: ошибка: invalid conversion from 'QFlagsQDir::SortFlag::Int {aka int}' to 'Dir::SortFlag' [-fpermissive]
Dir::SortFlags sorting_= (int)dir_.sorting();
Как это исправить?
Да помнится так были проблемы при сборке MinGW я вроде исправил но на гит не закомитил. Если завтра будет время займусь.
Не думал, что так оперативно ответите. Спасибо большое, буду ждать! =)
Обновил на гите исходники https://github.com/Avazart/LibraryCollector/tree/lc_js
Пожалуйста отпишитесь об успешности пересборки, обратная связь важна.
Да, собралось. После сборки при запуске требовались dll, перекинул всю папки bin, plugins(не знаю как можно было сделать более умно). Как я понял в первой строке путь к екзешнику вставляю, вторая строка пусть к компилятору, третья куда будут переноситься все необходимые файлы и четвертая просто выбрать скрипт который лежит в папке с коллектором, выбрать две галочки и нажать запуск, после проюзать программу и нажать апдейт? Список bin, plugins, qml, resources и т.д. не отображается. Когда нажимаю апдейт коллектор закрывается а программа продолжает работать, что в таком случае я сделал неправильно?
upd.
Перекинул все файлы с архива проекта в собранную версию, начали подгружаться автоматически настройки и высвечиваться список bin, plugins, qml, resources и т.д. Указал все папки верно при нажатии на run пишется "неверно задано имя папки"(5 раз переписывал путь).
upd2.
Написал в пути к папке с компилятором msvc, нажал run, появилось сообщение в консоле что запущено, затем поставил нормальный путь к папке с компилятором и все заработало, но теперь при попытке все скопировать выскакивают ошибки в консоле, что невозможно скопировать файл из папки в папку.
upd3.
Не знаю, что произошло, но с 5 перезапуском все работает отлично (разве что не может скопировать исполняемый файл с заменой если копирую в ту же папку, где он находится), спасибо большое, все работает отлично)
С Вашего позволения могу выставить сюда ссылку на гугл диск с архивом коллектора х64 на 264мб? Или может подскажете, как поудалять в нем все ненужные файлы, которые я туда закинул, чтобы уменьшить размер?
Deleted
Стоило перед использованием что ли инструкцию прочитать
https://www.cyberforum.ru/blogs/131347/blog2457.html
"После сборки при запуске требовались dll,"
Ясное дело стоило задеплоить сборщик самим "себя".
Кроме DLL нужно еще было скопировать папку с js-скриптами и ini -файл с настройками из исходников. И ясное дело изменить пути на свои под свою сборку где нужно. В обще так как это сделоно в 32битной версии деплоя выложенном мною на форуме.
"вторая строка пусть к компилятору"
Не к компилятору, а к QTDIR т.е. папка сборки/комплекта Qt.
""Указал все папки верно при нажатии на run пишется "неверно задано имя папки"(5 раз переписывал путь). ""
Значит таки не верное указали. За поддержкой обращайтесь к гадалке.
"что невозможно скопировать файл из папки в папку. "
Значит не возможно. Может звезды не сошлись или плохая карма опять же к гадалке.
Мне же нужно дословное описание ошибки.
Вы меня не совсем правильно поняли, но все равно спасибо, принял все к сведению. Все сделал как вы сказали, все отлично работает, еще раз огромнейшее спасибо) Разве что только что были опять проблемы с неверным именем папки, после перезапуска все работает. И не стоит иронизировать с гадалкой, я в QT новичек да и в этих тонкостях сборки с dll и проектов в QT очень слабо знаком, поэтому расписал так, как понял это сам) Вам скинуть архив для размещения х64 версии в вашей статье?