Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: ilot от Декабрь 21, 2009, 18:24



Название: Подключение плагинов при переносе на машину без установленной Qt.
Отправлено: ilot от Декабрь 21, 2009, 18:24
Здравствуйте. Столкнулся с проблемой - при переносе на машину без установленной библиотеки QT не подключается плагин для работы с изображением (qjpeg4.dll) - там, где должна быть картинка, пустое место. Все остальное работает нормально. Решения, которые я пробовал мне не помогли. А пробовал я следующие способы:

1. Добавление  в функцию main() дополнительного пути к списку, по которому приложение производит поиск библиотек:
Код:
QApplication app(argc,argv);
QApplication::addLibraryPath(app.applicationDirPath() + "/plugins/");
в папку plugins перенес все папки с плагинами;

2. копировал в директорию с исполняемым файлом папку с нужными плагинами (imageformats);

3. пробовал применять конфигурационный файл qt.conf следующего содержания:
Код:
[Path]
Plugins = plugins
где plugins - папка с плагинами, находится в директории с исполняемым файлом.
qt.conf нормально подхватывается приложением - предопределенные пути изменяются как нужно(проверял с помощью QLibraryInfo), но
эффекта нет.

Других вариантов у меня нет. У кого есть собственный опыт решения такой проблемы?

Qt собрана как shared. Проект собирают в VS2008. Статическая сборка проекта мной не рассматривается.


Название: Re: Подключение плагинов при переносе на машину без установленной Qt.
Отправлено: Пантер от Декабрь 21, 2009, 18:42
Поищи по форуму, вопрос уже не раз поднимался. Если не найдешь, отпишись.


Название: Re: Подключение плагинов при переносе на машину без установленной Qt.
Отправлено: ilot от Декабрь 21, 2009, 19:00
Да, поднимался. Например, здесь http://www.prog.org.ru/topic_8865_0.html (http://www.prog.org.ru/topic_8865_0.html). Я просмотрел все темы, касающиеся проблем с плагинами (нашлось их немного). Я использовал предлагаемые решения, но мне это не помогло. Да и сами авторы, как в приведенном примере, не сообщали об успешном разрешении проблемы. Поэтому я решил создать новую тему.. Даже зарегистрироваться пришлось  :)


Название: Re: Подключение плагинов при переносе на машину без установленной Qt.
Отправлено: Пантер от Декабрь 21, 2009, 19:08
Покажи место, где подгружаешь картинку в программе.
Таких проблем не должно быть, если собрать Qt с параметром -qt-libjpeg.


Название: Re: Подключение плагинов при переносе на машину без установленной Qt.
Отправлено: ilot от Декабрь 21, 2009, 19:20
Код:
QPixmap pix;
pix.load("picture.jpg");
m_picture = new QLabel;
m_picture->resize(600, 400);
m_picture->setFrameStyle(QFrame::Panel|QFrame::Raised);
m_picture->setPixmap(pix.scaled(QSize(600,400)));

На машине с установленной Qt все работает нормально, поэтому дело должно быть в подключении самого плагина.
Я смотрел ProcessExplorer-ом список dll, которые задействует приложение: при запуске в системе с Qt qjpeg4.dll загружается программой, а на целевой машине (без Qt) данная библиотека не подхватывается.

библиотека собиралась со следующими опциями:
Код:
configure -platform win32-msvc2008 -shared -qt-sql-odbc -qt-sql-sqlite -no-qt3support -no-opengl -no-phonon -qt-style-windowsxp


Название: Re: Подключение плагинов при переносе на машину без установленной Qt.
Отправлено: Пантер от Декабрь 21, 2009, 19:25
Попробуй полный путь к картинке, на всякий случай. Т.е. pix.load("c:\picture.jpg");


Название: Re: Подключение плагинов при переносе на машину без установленной Qt.
Отправлено: lit-uriy от Декабрь 21, 2009, 19:29
можно путь и относительный:
./picture.jpg

П.С. Пантер, ты забыл слеш заэкранировать


Название: Re: Подключение плагинов при переносе на машину без установленной Qt.
Отправлено: ilot от Декабрь 21, 2009, 19:42
А причем здесь путь к картинке? Программа, запущенная на машине с Qt,  ее прекрасно находит в собственной директории.
можно путь и относительный:
./picture.jpg
путь и так относительный указывается.

На всякий случай попробовал - не помогло.


Название: Re: Подключение плагинов при переносе на машину без установленной Qt.
Отправлено: lit-uriy от Декабрь 21, 2009, 19:46
По идее варианта №2 (из твоего первого сообщения) достаточно.
Почисть кэш плагинов, возможно, при эксперементах в него был занесён этот плагин.


Название: Re: Подключение плагинов при переносе на машину без установленной Qt.
Отправлено: Пантер от Декабрь 21, 2009, 19:46
lit-uriy: каюсь, забыл. :)
ilot: попробуй собрать с ключем -qt-libjpeg.


Название: Re: Подключение плагинов при переносе на машину без установленной Qt.
Отправлено: ilot от Декабрь 21, 2009, 20:27
lit-uriy: почитал про кеш плагинов...
Цитировать
In order to speed up loading and validation of plugins, some of the information that is collected when plugins are loaded is cached through QSettings. This includes information about whether or not a plugin was successfully loaded, so that subsequent load operations don't try to load an invalid plugin.
Таким образом, в кеш попадает информация обо всех когда либо загруженных плагинах: имя, успешность загрузки, timestamp последней модификации. Здесь начинается самое интересное: при запуске программы на "чистой" системе в реестре в нужном месте появляются записи обо ВСЕХ плагинах из папки imageformats. Отсюда можно сделать вывод, что плагины системой все-таки как-то подхватываются (вопрос: до конца ли?). Если удалить ветку с инфой о плагинах и запустить программу снова, то записи в реестре создаются заново. Вроде все правильно.. А нужно эффекта все нет - изображение не появляется.

Вообще говоря, чистка кеша (как и любого др. кеша) плагинов актуально только, если в них были произведены изменения. Например, если бы я занимался разработкой/модификацией плагинов. А так там все данные актуальны.

Пантер: можно, конечно, попробовать.. от безисходности. Только думается мне, что тогда бы на машине с Qt это тоже не работало.


Название: Re: Подключение плагинов при переносе на машину без установленной Qt.
Отправлено: lit-uriy от Декабрь 21, 2009, 22:03
ну как вариант проверить на третьей машине, по варианту №2.

Есть ещё переменная окружения QT_DEBUG_PLUGINS, для отладки плагинов, но я никогда не пользовался.

Про отладку плагинов можно прочитать на русском здесь (http://www.doc.crossplatform.ru/qt/4.4.3/plugins-howto.html#debugging-plugins)


Название: Re: Подключение плагинов при переносе на машину без установленной Qt.
Отправлено: crackedmind от Декабрь 22, 2009, 10:30
Проверь, плагины вообще загружаются.

В OpenHomm я так проверяю.

Код:
void checkPlugins()
{
    QList<QByteArray> formats = QImageReader::supportedImageFormats();

    if ( !formats.contains("def") || !formats.contains("pcx" )) {
        QMessageBox::critical(NULL, "Critical error!", "Plugins didn't load. Files maybe corrupted. Try to re-install application.");
        exit(1);
    }
}

p.s. поддержка форматов def & pcx естественно реализована своими плагинами :)


Название: Re: Подключение плагинов при переносе на машину без установленной Qt.
Отправлено: ilot от Январь 15, 2010, 15:00
Проверь, плагины вообще загружаются.
На виртуальной машине поставил оригинальную сборку WinXPSP2. Перенес проект, результат тот же - jpg-картинка перестала отображаться.
Воспользовавшись советом от crackedmind, проверил подгружаемые плагины.

На машине с установленной Qt выдало такой список поддерживаемых форматов:
bmp gif ico jpeg jpg mng pbm pgm png ppm svg tif tiff xbm xpm

На "чистой" тестовой машине:
bmp pbm pgm png ppm xbm xpm

Недосдача... :-\ Сконвертировал jpg в png, пересобрал, перенес на тестовую машину - все нормально отображается.  :) Буду использовать png, но вопрос так и остался открытым. Поэтому, если кто что-нибудь знает - пишите!

P.S. папка imageformats переносится с исполняемым файлом со всем своим содержимым.


Название: Re: Подключение плагинов при переносе на машину без установленной Qt.
Отправлено: SASA от Январь 15, 2010, 15:50
А файлика qt.conf рядом не валяется?


Название: Re: Подключение плагинов при переносе на машину без установленной Qt.
Отправлено: ilot от Январь 15, 2010, 16:00
А файлика qt.conf рядом не валяется?
нет. попробовал один раз (описал в первом посте). Поскольку не получилось - убрал. Больше не использовал.


Название: Re: Подключение плагинов при переносе на машину без установленной Qt.
Отправлено: crackedmind от Январь 15, 2010, 18:21
На чистую машину надо еще рантайм от студии поставить нормально, а то плагины его не находят и поэтому не грузятся.


Название: Re: Подключение плагинов при переносе на машину без установленной Qt.
Отправлено: ilot от Январь 15, 2010, 18:53
На чистую машину надо еще рантайм от студии поставить нормально, а то плагины его не находят и поэтому не грузятся.
Что значит "поставить нормально"?
Я таскаю в папке с экзешником манифест и библиотеки рантайма (VS2008):

Microsoft.VC90.CRT.manifest
msvcm90.dll
msvcp90.dll
msvcr90.dll

Может еще что-то нужно?
Да и не понятно почему часть плагинов грузится, а часть - нет. Выходит у них необходимые условия запуска отличаются?


Название: Re: Подключение плагинов при переносе на машину без установленной Qt.
Отправлено: SASA от Январь 15, 2010, 19:35
Пять минут назад не смог на чистой машине запустить mysql плагин.
Это заговр :)
Кто понимает, о чём говорят записи в реестре о плагинах?


Название: Re: Подключение плагинов при переносе на машину без установленной Qt.
Отправлено: crackedmind от Январь 15, 2010, 20:25
http://www.microsoft.com/downloads/details.aspx?FamilyID=9b2da534-3e03-4391-8a4d-074b9f2bc1bf&displaylang=en
Вот это я обозвал "нормальной установкой". Либо поизвращайтесь с манифестами.


Название: Re: Подключение плагинов при переносе на машину без установленной Qt.
Отправлено: SASA от Январь 16, 2010, 10:56
http://www.microsoft.com/downloads/details.aspx?FamilyID=9b2da534-3e03-4391-8a4d-074b9f2bc1bf&displaylang=en
Вот это я обозвал "нормальной установкой". Либо поизвращайтесь с манифестами.
Я так и ставил.


Название: Re: Подключение плагинов при переносе на машину без установленной Qt.
Отправлено: SASA от Январь 19, 2010, 12:23
Если кому ещё интересно.
Оказывается для работы  mysql плагин нужна libmysql.dll. :D


Название: Re: Подключение плагинов при переносе на машину без установленной Qt.
Отправлено: Akaiten от Январь 19, 2010, 13:49
Кароче, это всё из-за манифестов. Qt необходимо компилить с параметром -no-plugin-manifests.

В коде делаю так:
Код
C++ (Qt)
QApplication a(argc, argv);
...
a.addLibraryPath(a.applicationDirPath() + "/plugins");
 

При этом в каталоге с exe-шником должна находиться папка plugins\imageformats\, куда и помещаются библиотеки image-плагинов. И всё! Работает как часы.


Название: Re: Подключение плагинов при переносе на машину без установленной Qt.
Отправлено: BRE от Январь 19, 2010, 14:05
Можно не делать addLibrarypath и imageformats положить в каталог с exe.


Название: Re: Подключение плагинов при переносе на машину без установленной Qt.
Отправлено: Sahab от Январь 19, 2010, 16:21
не находит qsqlite.dll

Добавил addLibrarypath - не помогает
в одну папку с exe - не промогает
Обязательно компилить с с параметром -no-plugin-manifests?


Название: Re: Подключение плагинов при переносе на машину без установленной Qt.
Отправлено: BRE от Январь 19, 2010, 16:48
не находит qsqlite.dll
Куда кладешь qsqlite.dll?
Как его собирал?


Название: Re: Подключение плагинов при переносе на машину без установленной Qt.
Отправлено: Sahab от Январь 19, 2010, 16:59
applicationDirPath()
applicationDirPath() + /sqldrivers
applicationDirPath() + /plugins
applicationDirPath() + /plugins/sqldrivers
короче везде

qsqlite.dll не собирал т.к. юзаю precompiled для MSVC 2008


Название: Re: Подключение плагинов при переносе на машину без установленной Qt.
Отправлено: Akaiten от Январь 19, 2010, 17:25
Всё идёт от VC runtime libraries. Варианты решения:
  • На конечной машине пользователя устанавливать VC redistributable package (рекомендовано Microsoft)
  • Кидать в папку в программой файлы Microsoft.VC90.CRT.manifest и msvcm90.dll, msvcp90.dll, msvcr90.dll (можно только те, которые используются) и использовать plugins без манифестов (QT надо собирать с опцией -no-plugin-manifests)
  • [не проверено] Кидать в папку в программой и во все папки с plugins файлы Microsoft.VC90.CRT.manifest и msvcm90.dll, msvcp90.dll, msvcr90.dll (можно только те, которые используются)
  • Другие варианты? Например, ссылка (http://toddcwilson.com/blog/2009/08/qt-plugins-and-side-by-side/)


Название: Re: Подключение плагинов при переносе на машину без установленной Qt.
Отправлено: SASA от Январь 19, 2010, 17:26
У меня работает вариант applicationDirPath() + /sqldrivers.
Правда плагин называется qsqlite4.dll.
И не забывем про
http://www.microsoft.com/downloads/details.aspx?FamilyID=9b2da534-3e03-4391-8a4d-074b9f2bc1bf&displaylang=en
А так, посмотри депендес вьюером. Мож чего не хватает.


Название: Re: Подключение плагинов при переносе на маш&
Отправлено: Sahab от Январь 19, 2010, 17:38
dv - ничего  не покажет (и не показал) т.к. sqlite подгружается как плагин динамически
плагин конечно же qsqlite4.dll
манифест + с/с++ рантайм лежит рядом с exe

 не помогает

нужно пересобирать Qt?


Название: Re: Подключение плагинов при переносе на машину без установленной Qt.
Отправлено: crackedmind от Январь 20, 2010, 05:55
Всё идёт от VC runtime libraries. Варианты решения:
  • На конечной машине пользователя устанавливать VC redistributable package (рекомендовано Microsoft)
  • Кидать в папку в программой файлы Microsoft.VC90.CRT.manifest и msvcm90.dll, msvcp90.dll, msvcr90.dll (можно только те, которые используются) и использовать plugins без манифестов (QT надо собирать с опцией -no-plugin-manifests)
  • [не проверено] Кидать в папку в программой и во все папки с plugins файлы Microsoft.VC90.CRT.manifest и msvcm90.dll, msvcp90.dll, msvcr90.dll (можно только те, которые используются)
  • Другие варианты? Например, ссылка (http://toddcwilson.com/blog/2009/08/qt-plugins-and-side-by-side/)
Добавлю.
В IM клиенте qutim сделано вот так:
В папке с программой лежат нужные файлы. В папке с плагинами лежит Microsoft.VC90.CRT.manifest c изменненым содержимым.
Код
XML
<file name="../msvcr90.dll" /> <file name="../msvcp90.dll" /> <file name="../msvcm90.dll" />


Название: Re: Подключение плагинов при переносе на маш&
Отправлено: z11t3 от Февраль 08, 2010, 07:27
нужно пересобирать Qt?
нет, плагин перекомпилить
выполнить две комманды (пример для odbc), у меня QT собран статически /!\
>>cd %QTDIR%\src\plugins\sqldrivers\odbc
>> qmake odbc.pro
>> nmake