Russian Qt Forum
Ноябрь 24, 2024, 04:44 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Как узнать какие файлы нужны для запуска Qt приложения на голом виндусе?  (Прочитано 16591 раз)
juvf
Программист
*****
Offline Offline

Сообщений: 570


Просмотр профиля
« : Март 20, 2020, 08:08 »

Как узнать какие файлы нужны для запуска Qt приложения на голом виндусе?
« Последнее редактирование: Март 20, 2020, 08:59 от juvf » Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #1 : Март 20, 2020, 08:46 »

http://www.dependencywalker.com/
Записан
juvf
Программист
*****
Offline Offline

Сообщений: 570


Просмотр профиля
« Ответ #2 : Март 20, 2020, 09:12 »

спасибо, dependencywalker почти справился.... из требуемых 7 библиотек показал 6. Не показал libwinpthread-1.dll
Ну и не показал platforms/qwindows.dll и imageformats/qico.dll

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

Сообщений: 2812


Просмотр профиля
« Ответ #3 : Март 20, 2020, 10:06 »

> Ну и не показал platforms/qwindows.dll и imageformats/qico.dll

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

ArchLinux x86_64 / Win10 64 bit
juvf
Программист
*****
Offline Offline

Сообщений: 570


Просмотр профиля
« Ответ #4 : Март 20, 2020, 10:49 »

И не покажет, т.к. это динамически загружаемые плагины
и что? как это мне поможет?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #5 : Март 20, 2020, 12:26 »

1) поставить чистую винду в виртуалке
2) потестировать приложение
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #6 : Март 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() );
 

в консоли увидите список зависимостей.
« Последнее редактирование: Март 20, 2020, 16:46 от ssoft » Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #7 : Март 20, 2020, 17:33 »

Утилиты типа Process Hacker много интересного о процессах выдают. В том числе список модулей.
Записан

Пока сам не сделаешь...
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #8 : Март 20, 2020, 17:36 »

Я просто оставлю это тут https://doc.qt.io/qt-5/windows-deployment.html
Записан
juvf
Программист
*****
Offline Offline

Сообщений: 570


Просмотр профиля
« Ответ #9 : Март 23, 2020, 08:16 »

Я просто оставлю это тут https://doc.qt.io/qt-5/windows-deployment.html
Про это уже сказано, что не работает. См выше.
Записан
juvf
Программист
*****
Offline Offline

Сообщений: 570


Просмотр профиля
« Ответ #10 : Март 23, 2020, 12:55 »

Внедрите в приложение код
...

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

Значит на 2020 пока что по старинке, в рукопашную, через виртуалку и тест в голой винде (((
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #11 : Март 23, 2020, 14:00 »

Я просто оставлю это тут https://doc.qt.io/qt-5/windows-deployment.html
Про это уже сказано, что не работает. См выше.

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

Шутки шутки, но в статье есть список дллок которые они ставят.
qwindows.dll и qico.dll - это плагины. Плагины. ПЛАГИНЫ. Ни одна тулза вам не покажет плагины потому что приложение к ним не линкуется. Только разработчик приложения знает какие плагины ему нужны, а какие нет.
« Последнее редактирование: Март 23, 2020, 14:45 от Авварон » Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #12 : Март 23, 2020, 14:46 »

Ни одна тулза вам не покажет плагины потому что приложение к ним не линкуется.

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

Сообщений: 570


Просмотр профиля
« Ответ #13 : Март 23, 2020, 14:55 »

Не работает что именно?
Я же писал что ИМЕННО не работает в windeployqt. Посмотрите выше..... windeployqt собирает всё что нужно и не нужно. За чем мне то, что не нужно? Можно и ебз windeployqt всю папку Qt/bin скопировать и не париться.

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

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

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

Цитировать
предложу еще вариант - собрать Qt статически!
не вариант.
Записан
juvf
Программист
*****
Offline Offline

Сообщений: 570


Просмотр профиля
« Ответ #14 : Март 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
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.177 секунд. Запросов: 23.