Название: Подключение плагинов при переносе на машину без установленной Qt. Отправлено: ilot от Декабрь 21, 2009, 18:24 Здравствуйте. Столкнулся с проблемой - при переносе на машину без установленной библиотеки QT не подключается плагин для работы с изображением (qjpeg4.dll) - там, где должна быть картинка, пустое место. Все остальное работает нормально. Решения, которые я пробовал мне не помогли. А пробовал я следующие способы:
1. Добавление в функцию main() дополнительного пути к списку, по которому приложение производит поиск библиотек: Код: QApplication app(argc,argv); 2. копировал в директорию с исполняемым файлом папку с нужными плагинами (imageformats); 3. пробовал применять конфигурационный файл qt.conf следующего содержания: Код: [Path] 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; На машине с установленной 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() 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.
В коде делаю так: Код
При этом в каталоге с 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. Варианты решения:
Название: 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. Варианты решения: Добавлю.
В IM клиенте qutim сделано вот так: В папке с программой лежат нужные файлы. В папке с плагинами лежит Microsoft.VC90.CRT.manifest c изменненым содержимым. Код
Название: Re: Подключение плагинов при переносе на маш& Отправлено: z11t3 от Февраль 08, 2010, 07:27 нужно пересобирать Qt? нет, плагин перекомпилитьвыполнить две комманды (пример для odbc), у меня QT собран статически /!\ >>cd %QTDIR%\src\plugins\sqldrivers\odbc >> qmake odbc.pro >> nmake |