Russian Qt Forum

Qt => Общие вопросы => Тема начата: juvf от Март 20, 2020, 08:08



Название: Как узнать какие файлы нужны для запуска Qt приложения на голом виндусе?
Отправлено: juvf от Март 20, 2020, 08:08
Как узнать какие файлы нужны для запуска Qt приложения на голом виндусе?


Название: Re: Как узнать какие файлы нужны для запуска Qt приложения на голом виндусе?
Отправлено: qate от Март 20, 2020, 08:46
http://www.dependencywalker.com/


Название: Re: Как узнать какие файлы нужны для запуска Qt приложения на голом виндусе?
Отправлено: juvf от Март 20, 2020, 09:12
http://www.dependencywalker.com/
спасибо, dependencywalker почти справился.... из требуемых 7 библиотек показал 6. Не показал libwinpthread-1.dll
Ну и не показал platforms/qwindows.dll и imageformats/qico.dll

ps windeployqt наоборот перестраховывается, собирает всё что нужно и не нужно. при ручной компановке 19 Мб, винплой делает 43 Мб.


Название: Re: Как узнать какие файлы нужны для запуска Qt приложения на голом виндусе?
Отправлено: kuzulis от Март 20, 2020, 10:06
> Ну и не показал platforms/qwindows.dll и imageformats/qico.dll

И не покажет, т.к. это динамически загружаемые плагины


Название: Re: Как узнать какие файлы нужны для запуска Qt приложения на голом виндусе?
Отправлено: juvf от Март 20, 2020, 10:49
И не покажет, т.к. это динамически загружаемые плагины
и что? как это мне поможет?


Название: Re: Как узнать какие файлы нужны для запуска Qt приложения на голом виндусе?
Отправлено: kambala от Март 20, 2020, 12:26
1) поставить чистую винду в виртуалке
2) потестировать приложение


Название: Re: Как узнать какие файлы нужны для запуска Qt приложения на голом виндусе?
Отправлено: ssoft от Март 20, 2020, 16:43
Внедрите в приложение код

Код
C++ (Qt)
#include <string>
#include <map>
#include <vector>
#include <libloaderapi.h>
 
struct Module
{
   typedef HMODULE Handle;
   typedef ::std::string Name;
   typedef ::std::vector< Name > Names;
   typedef ::std::string Path;
 
   Handle m_handle;
   Path m_path;
   Names m_names;
 
   Module ()
       : m_handle(  )
       , m_path()
       , m_names()
   {
   }
};
 
struct Application
{
   typedef ::std::map< Module::Handle, Module > Modules;
   Modules m_modules;
 
   Application ();
   void init ( Module::Name name = Module::Name() );
};
 
 
Application::Application ()
{
   init();
}
 
void Application::init ( Module::Name name )
{
   Module::Handle handle = GetModuleHandleA( name.empty() ? LPCSTR() : name.c_str() );
   Module & module = m_modules[ handle ];
   for ( size_t i = 0; i < module.m_names.size(); ++i )
       if ( name == module.m_names[ i ] )
           return;
   module.m_names.push_back( name );
 
   if ( module.m_names.size() == 1 )
   {
       module.m_handle = handle;
 
       DWORD path_buffer_size = DWORD();
       DWORD path_size = MAX_PATH;
       while ( path_size && path_size >= path_buffer_size )
       {
           path_buffer_size += MAX_PATH;
           module.m_path.resize( path_buffer_size );
           path_size = GetModuleFileNameA( handle, &module.m_path.front(), path_buffer_size );
       }
       module.m_path[ path_size ] = '\0'; // case Windows XP. It is guaranteed that 'path_size < path_buffer_size' here.
 
       PIMAGE_DOS_HEADER dos_header = PIMAGE_DOS_HEADER( module.m_handle );
       if ( dos_header->e_magic != IMAGE_DOS_SIGNATURE )
           return;
 
       PIMAGE_NT_HEADERS nt_headers = PIMAGE_NT_HEADERS( LPBYTE( dos_header ) + dos_header->e_lfanew );
       if ( nt_headers->Signature != IMAGE_NT_SIGNATURE )
           return;
 
       DWORD virtual_address = nt_headers->OptionalHeader.DataDirectory[ 1 ].VirtualAddress;
       if ( virtual_address != DWORD() )
       {
           PIMAGE_IMPORT_DESCRIPTOR image_import_descriptor = PIMAGE_IMPORT_DESCRIPTOR( LPBYTE( dos_header ) + virtual_address );
           for( int i = 0; image_import_descriptor[ i ].Characteristics != DWORD(); ++i )
           {
               init( LPCSTR( LPBYTE( dos_header ) + image_import_descriptor[ i ].Name ) );
           }
       }
   }
}
 
void printApplication ( const Application & application )
{
   for ( const auto & pr : application.m_modules )
   {
       const Module & module = pr.second;
       printf( "%s\n", module.m_path.c_str() );
       for ( const auto & name : module.m_names )
           printf( "\t%s\n", name.c_str() );
   }
}
 

и вызовите где-нибудь

Код
C++ (Qt)
printApplication( Application() );
 

в консоли увидите список зависимостей.


Название: Re: Как узнать какие файлы нужны для запуска Qt приложения на голом виндусе?
Отправлено: ViTech от Март 20, 2020, 17:33
Утилиты типа Process Hacker (https://ru.wikipedia.org/wiki/Process_Hacker) много интересного о процессах выдают. В том числе список модулей.


Название: Re: Как узнать какие файлы нужны для запуска Qt приложения на голом виндусе?
Отправлено: Авварон от Март 20, 2020, 17:36
Я просто оставлю это тут https://doc.qt.io/qt-5/windows-deployment.html


Название: Re: Как узнать какие файлы нужны для запуска Qt приложения на голом виндусе?
Отправлено: juvf от Март 23, 2020, 08:16
Я просто оставлю это тут https://doc.qt.io/qt-5/windows-deployment.html
Про это уже сказано, что не работает. См выше.


Название: Re: Как узнать какие файлы нужны для запуска Qt приложения на голом виндусе?
Отправлено: juvf от Март 23, 2020, 12:55
Внедрите в приложение код
...

в консоли увидите список зависимостей.
Спсибо за полезный совет. Сделал. Увидел много чего.... из нужного (т.е. из того чего нет в голой винде) увидел 7 требуемых дополнительных *.dll. Не показал platforms/qwindows.dll и imageformats/qico.dll

Значит на 2020 пока что по старинке, в рукопашную, через виртуалку и тест в голой винде (((


Название: Re: Как узнать какие файлы нужны для запуска Qt приложения на голом виндусе?
Отправлено: Авварон от Март 23, 2020, 14:00
Я просто оставлю это тут https://doc.qt.io/qt-5/windows-deployment.html
Про это уже сказано, что не работает. См выше.

Не работает что именно? Там огромная статья и по факту пока все предложения в ней тоже есть. Ладно, раз мы любим цитировать доку, предложу еще вариант - собрать Qt статически!

Шутки шутки, но в статье есть список дллок которые они ставят.
qwindows.dll и qico.dll - это плагины. Плагины. ПЛАГИНЫ. Ни одна тулза вам не покажет плагины потому что приложение к ним не линкуется. Только разработчик приложения знает какие плагины ему нужны, а какие нет.


Название: Re: Как узнать какие файлы нужны для запуска Qt приложения на голом виндусе?
Отправлено: qate от Март 23, 2020, 14:46
Ни одна тулза вам не покажет плагины потому что приложение к ним не линкуется.

"Process Hacker" показал qwindows.dll , который плагин и который "обычный" разработчик "не использует"


Название: Re: Как узнать какие файлы нужны для запуска Qt приложения на голом виндусе?
Отправлено: juvf от Март 23, 2020, 14:55
Не работает что именно?
Я же писал что ИМЕННО не работает в windeployqt. Посмотрите выше..... windeployqt собирает всё что нужно и не нужно. За чем мне то, что не нужно? Можно и ебз windeployqt всю папку Qt/bin скопировать и не париться.

Цитировать
qwidnows.dll и qico.dll - это плагин. Плагин. ПЛАГИН.
В контексте данной задачи вопроса темы вообще не интересно  - плагин это, модуль, библиотека, скрипт или аддон...
Задача тривиальная: выкатить программу в продакшин. Есть ехе, что нужно ещё? Какие файлы? Ни какие библиотеки и модули, а какие файлы? Конечному пользователю по барабану  qico.dll  - это плагин или модуль? Ему нужно рабочее приложение.

Пока что проверяю на чистой винде.... как советует kambala.

 
Цитировать
Ни одна тулза вам не покажет плагины
вот на этом можно было закончить эту тему.
Цитировать
Только азработчик приложения знает какие плагины ему нужны, а какие нет.
От куда?

Цитировать
предложу еще вариант - собрать Qt статически!
не вариант.


Название: Re: Как узнать какие файлы нужны для запуска Qt приложения на голом виндусе?
Отправлено: juvf от Март 23, 2020, 15:01
Ни одна тулза вам не покажет плагины потому что приложение к ним не линкуется.

"Process Hacker" показал qwindows.dll , который плагин и который "обычный" разработчик "не использует"

"Process Hacker" также показал нужный qico.dll.

"Process Hacker" вообще показал 100500 "модулей" чуть ли не на холовордное приложение. Как среди этого всего отобрать нужные? Process Hacker, также как и windeployqt, показал все длл-ки, ой, простите, все плагины, такие как qsvg, qjpeg, qgif.... у меня в приложении в помине нет gif, и моё приложение прекрасно работает без этой ddl-ки qgif.dll


Название: Re: Как узнать какие файлы нужны для запуска Qt приложения на голом виндусе?
Отправлено: Авварон от Март 23, 2020, 15:07
От куда?

Из документации. Только ее читать надо дальше первого абзаца.


Название: Re: Как узнать какие файлы нужны для запуска Qt приложения на голом виндусе?
Отправлено: qate от Март 23, 2020, 16:39
"Process Hacker" вообще показал 100500 "модулей" чуть ли не на холовордное приложение. Как среди этого всего отобрать нужные?

отсортировать по пути )
но конечно "Process Hacker" не покажет для незапущенного приложения ничего
я не знаю иного способа, кроме как запускать exe и смотреть на что он ругается, при этом про qwindows.dll  венда ничего не скажет - тут либо догадаться, либо  найти в документации  https://doc.qt.io/qt-5/windows-deployment.html

еще не забыть qt.conf создать и указать каталог плагинов )



Название: Re: Как узнать какие файлы нужны для запуска Qt приложения на голом виндусе?
Отправлено: juvf от Март 24, 2020, 07:03
2Авварон
Вопрос: Как узнать какие файлы нужны для запуска Qt приложения на голом виндусе?
ответ Авварон-а
Из документации.
Не поспоришь. Сразу бы так ответили.... И зачем вообще этот форум, если все можно узнать из документации?

Цитировать
Только ее читать надо дальше первого абзаца.
Покажите, пожалуйста, где в документации, во втором абзаце рассказано, как узнать какие файлы нужны для запуска Qt приложения на голом виндусе, в случае, если приложение собирается из 4-х проектов, и в каждом проекте участвовала отдельная группа разработчиков?

Цитировать
отсортировать по пути )
по какому пути? "По дороге с работы, по пути в гастроном" (С)?)) Попробуйте сами отсортировать и дайте скрин, плииз.
Цитировать
про qwindows.dll  венда ничего не скажет
Понятно.... вы не пробовали ни "Process Hacker", ни запустить exe без qwindows.dll. Поробуйте... Винда скажет.... по сказанному легко гуглиться проблема.

Цитировать
но конечно "Process Hacker" не покажет для незапущенного приложения ничего
сарказм или тролинг? Можно развить тему: "но конечно "Process Hacker" не покажет ничего на выключенном ПК"
Цитировать
я не знаю иного способа, кроме как запускать exe и смотреть на что он ругается
Я тоже не знаю иного способа. Друзья.... если вы знаете другой рабочий способ, если вы сами пробовали и практикуете иной реально рабочий способ - дайте лайфхак полезный совет, очень буду благодарен (и не только я). Если вы диванный теоретик, и сами практически свои же способы советы не пробовали, проходите мимо, не тратьте своё время.

Всем хорошего дня и успехов в работе!


Название: Re: Как узнать какие файлы нужны для запуска Qt приложения на голом виндусе?
Отправлено: qate от Март 24, 2020, 08:40
по какому пути?

по пути файла очевидно - добавь колонку "File name" на вкладке "Modules"

что касается сабжа, то мой путь - запуск и подкидывание нужных dll и плагинов, иного способа не знаю, возможно ктото и скажет


Название: Re: Как узнать какие файлы нужны для запуска Qt приложения на голом виндусе?
Отправлено: juvf от Март 24, 2020, 09:10
по пути файла очевидно - добавь колонку "File name" на вкладке "Modules"
Сортировка "по пути" задачу не решает. Отображаются все нужные и ненужные файлы, в куче, только отсортированы по путям.


Название: Re: Как узнать какие файлы нужны для запуска Qt приложения на голом виндусе?
Отправлено: qate от Март 24, 2020, 09:40
решает - смотри путь своего каталога, вендовый не смотри



Название: Re: Как узнать какие файлы нужны для запуска Qt приложения на голом виндусе?
Отправлено: juvf от Март 24, 2020, 09:50
решает - смотри путь своего каталога, вендовый не смотри


Желты выделил те модули, что нужны приложению. Все модули отсортированы по путям.  Как вы разработчик должен из этого отсортированного списка понять, что нужны только те, что желтым отмечены?


Название: Re: Как узнать какие файлы нужны для запуска Qt приложения на голом виндусе?
Отправлено: qate от Март 24, 2020, 09:58
Приложение расположено и запущено из каталога D\Work\TeslaTest ?
Тамже есть файл qt.conf ?



Название: Re: Как узнать какие файлы нужны для запуска Qt приложения на голом виндусе?
Отправлено: juvf от Март 24, 2020, 10:00
Приложение расположено и запущено из каталога D\Work\TeslaTest ?
да
Цитировать
Тамже есть файл qt.conf ?
нет


Название: Re: Как узнать какие файлы нужны для запуска Qt приложения на голом виндусе?
Отправлено: qate от Март 24, 2020, 10:03
хз чего там было в 5.6, почему именно эта версия ?

я проверил на 5.12.4 "64 bit" (такая попалась), собранный файл сам не лезит в каталоги из Qt


Название: Re: Как узнать какие файлы нужны для запуска Qt приложения на голом виндусе?
Отправлено: kuzulis от Март 24, 2020, 10:03
juvf ,

блин, ты издеваешься, а?

Выше уже сказали, что невозможно узнать какие плагины нужны пока само приложение их не заиспользовало..
Хоть хакайте, хоть не хакайте...  Можен оно заиспользует только при клике на кнопочку. И че, будешь прокликивать все кнопочки и парсить вывод?

ЗЫ: Не глуми голову ни себе ни людям!


Название: Re: Как узнать какие файлы нужны для запуска Qt приложения на голом виндусе?
Отправлено: juvf от Март 24, 2020, 10:23
хз чего там было в 5.6, почему именно эта версия ?

я проверил на 5.12.4 "64 bit" (такая попалась), собранный файл сам не лезит в каталоги из Qt

как мне эта информация поможет?


Название: Re: Как узнать какие файлы нужны для запуска Qt приложения на голом виндусе?
Отправлено: juvf от Март 24, 2020, 10:30
juvf ,

блин, ты издеваешься, а?

Выше уже сказали, что невозможно узнать какие плагины нужны пока само приложение их не заиспользовало..
Хоть хакайте, хоть не хакайте...  Можен оно заиспользует только при клике на кнопочку. И че, будешь прокликивать все кнопочки и парсить вывод?

ЗЫ: Не глуми голову ни себе ни людям!
Я чем и кого глумлю..... есть автоматизированный способ или нет? Я автоматизированного способа не знаю. Запускаю ехе на голой винде и проверяю без всяких тулс, руками.... я уже выше писал, на дворе 2020, а релиз по старинке, руками выкатывать.

Но мнения расходятся. Кто-то говорит плагнины не покажет, кто-то говорит покажет....


Название: Re: Как узнать какие файлы нужны для запуска Qt приложения на голом виндусе?
Отправлено: qate от Март 24, 2020, 10:57
как мне эта информация поможет?

запуск из креатора или руками из каталога ?
сборка release или debug ?


Название: Re: Как узнать какие файлы нужны для запуска Qt приложения на голом виндусе?
Отправлено: juvf от Март 24, 2020, 11:01
release из креатора. при запуске дебага другие, дебажные библиотеки, Qt5Cored.dll и т.п.


Название: Re: Как узнать какие файлы нужны для запуска Qt приложения на голом виндусе?
Отправлено: qate от Март 24, 2020, 11:13
я собирал таким скриптом:

Код:
set QTDIR=C:\Qt\Qt5.12.4\5.12.4\mingw73_64
PATH=%QTDIR%\bin;%QTDIR%\..\..\Tools\mingw730_64\bin\;%PATH%
mkdir Obj64
cd Obj64
qmake ../
mingw32-make -j 4 -f Makefile.Release

не знаю почему exe лезит к плагинам вне своей директории


Название: Re: Как узнать какие файлы нужны для запуска Qt приложения на голом виндусе?
Отправлено: ssoft от Март 24, 2020, 11:24
Но мнения расходятся. Кто-то говорит плагнины не покажет, кто-то говорит покажет....

Есть библиотеки, которые подгружаются при старте приложения. Это обязательные библиотеки, без которых приложение не запустится.
Есть библиотеки, которые подгружаются и выгружаются в процессе работы приложения по мере необходимост. К ним относятся и pluggins. Это опциональные библиотеки, без которых приложение запуститься.

Любой инструмент покажет только библиотеки загруженные в текущий момент. Какого рода плагины нужны знает только разработчик ПО исходя их используемых функций - работа с картинками, с БД, со звуком и т.п.

Плагины Qt входят в состав дистрибутива и по умолчанию поиск их осуществляется относительно директории установки Qt. Если не поставить нужные плагины, то приложение может запуститься, а корректно работать может и не смочь).

В чем проблема поставить полный дистрибутив Qt со всеми плагинами? Много места занимают или что?


Название: Re: Как узнать какие файлы нужны для запуска Qt приложения на голом виндусе?
Отправлено: qate от Март 24, 2020, 11:31
Плагины Qt входят в состав дистрибутива и по умолчанию поиск их осуществляется относительно директории установки Qt.

Что такое "директории установки Qt" , если на целевой машине нет никакого Qt ?
Поиск плагинов идет там, где прописано в qt.conf



Название: Re: Как узнать какие файлы нужны для запуска Qt приложения на голом виндусе?
Отправлено: kuzulis от Март 24, 2020, 12:06
Цитировать
Поиск плагинов идет там, где прописано в qt.conf

И да и нет. ЕМНИП, пути установки захардкожены в Qt (в qmake?). Например при установке инсталлятором они пропатчиваются, также как и при использовании windeployqt (если я не туплю).


Название: Re: Как узнать какие файлы нужны для запуска Qt приложения на голом виндусе?
Отправлено: qate от Март 24, 2020, 12:20
Цитировать
Поиск плагинов идет там, где прописано в qt.conf

И да и нет. ЕМНИП, пути установки захардкожены в Qt (в qmake?). Например при установке инсталлятором они пропатчиваются, также как и при использовании windeployqt (если я не туплю).

не совсем понял место и время, где и когда пути попадают в exe ?
я не вижу никаких строк в собранном мною, приведенном выше скриптом, exe файле
и насколько я знаю в венде нет rpath


Название: Re: Как узнать какие файлы нужны для запуска Qt приложения на голом виндусе?
Отправлено: juvf от Март 24, 2020, 12:24
Какого рода плагины нужны знает только разработчик ПО исходя их используемых функций - работа с картинками, с БД, со звуком и т.п.
Не всегда так. Бывают большие проекты.... например я писал небольшую программу, но она использовала внешние модули, которые писала другая группа разработчиков. В итоге мне нужно было из 4-х увесистых проектов собирать своё. Сторонние проекты тяжёлые, но мне нужно от них было буквально пару классов... которые по полиморфизму тянули дерево виртуальных и/или абстрактных классов.... В итоге ко мне в ехе попала совсем не большая часть от их кода. Так вот, что там они использовали? БД или звук... ico или gif, я не знаю. Мне проще было собрать приложение, поместить в песошницу и докинуть нужные либы.

Другой пример.... разработка устройства.... 3-5 лет.... написал тестовую утилиту... как говориться "для себя". В заголовке pro файла комент "Project created by QtCreator 2017-12-12". больше 2-х лет назад. Разработка изделия проживает свой жизненный цикл.... я свою часть разработал, утилитой проверил... изделие получило сертификат. Теперь для обслуживающему персоналу нужно дать инструменты для обслуживания. Пару рющек в свою утилиту.... добавил about() и нужно выдать релиз. Какие функции я использовал более 2-х лет назад?

Спросил коллег - как нынче в Qt релизы выкатывать? Ответ: "windeployqt, но будет много мусора!" Собрал с помощью windeployqt библы.... windeployqt докинул мне много лишнего, например opengl32sw.dll. Что такое openGl и зачем он мне нужен? Его я ТОЧНО не использовал ни 2 года назад, ни 12 лет назад. Коллеги не паряться, выкатывают релизы с помощью windeployqt, у них релизы по 2Гб весят.

Я решил заморочиться и узнать - есть ли более кошерный способ, автоматический, без лишних либ? Оказалось нет.

Цитировать
В чем проблема поставить полный дистрибутив Qt со всеми плагинами? Много места занимают или что?
Что вы имеете в виду "поставить"? Инсталлировать в целевую винду полный дистрибутив Qt? Или сложить все либы и плагины лядом с ехе на целевой винде?