Russian Qt Forum

Qt => Общие вопросы => Тема начата: digited от Март 04, 2010, 18:39



Название: QPluginLoader не может load() вне QtCreator
Отправлено: digited от Март 04, 2010, 18:39
Привет, прошу помощи:
под winxp/Qt 4.6/mingw свое приложение нормально грузит самописные плагины (динамически), пока запускается из-под QtCreator. Как только пытаюсь вынуть и собрать автономную версию (с .dll-ками мингв, гцц и кьюта), приложение не может загрузить плагины (хотя видит их), QtPluginLoader.instance и .load возвращают нули, имя плагина передается абсолютным, пробовал с обоими слэшами - грузит из-под креатора, автономно - не грузит ни в какую :(

В реестре в plugin cache.false никакой разницы c успешными загрузками не пишется (кроме 0 в одном месте), все собираю в релизе.

Собственно, вопрос: что такого мистического может выставлять QtCreator запускаемому приложению, что QPluginLoader нормально грузит .dll с моими плагинами, но не может вне QtCreator'а?

p.s. echoplugin вот работает отдельно, то есть 95% что я что-то где-то недописал... Но вот что и где? Все точно в релизе, файлы плагинов точно есть и не заблокированы ничем, имена передаются абсолютными путями загрузчику... Пробовал и неабсолютными - то же.

Спасибо.


Название: Re: QPluginLoader не может load() вне QtCreator
Отправлено: Rcus от Март 04, 2010, 18:54
QPluginLoader::errorString() так понимаю смотрели? И загружать через QLibrary (для выявления проблем связанных с разрешением символов из зависимостей) пробовали? хм...


Название: Re: QPluginLoader не может load() вне QtCreator
Отправлено: digited от Март 04, 2010, 19:05
errorString: "Cannot load library C:/somepath/logond.dll: The specified module could not be found."
Но дллька там точно лежит. Настораживают никсовые слэши в пути, хотя пробовал скармливать путь, обработанный .toNativeSeparators - результат тот же :(
Опять же, запускаю сие из-под QtCreator, полный путь к плагину так же (проверил точно) передается QPluginLoader'у, но тот спокойно все "находит" и грузит.

QLibrary не пробовал, стоит ли?


Название: Re: QPluginLoader не может load() вне QtCreator
Отправлено: digited от Март 04, 2010, 19:13
Мде, смотрю qpluginloader.cpp:337

QString fn = QFileInfo(fileName).canonicalFilePath();

Видимо, с никсовыми слэшами - это так задумано.


Название: Re: QPluginLoader не может load() вне QtCreator
Отправлено: digited от Март 04, 2010, 19:18
Ошибка, которая у меня вылазит, видимо, пишется в qt\src\plugin\qlibrary_win.cpp:87

ps если положить плагин в windows/system, без полного пути никак не видится, с полным путем то же - нормально грузится из-под креатора и "не находится" при запуске приложения руками. Админский аккаунт, никаких особых прав на файле вроде нет. Пробовали на другой виндовой машине без установленного кьюта - то же, плагин "не находится".


Название: Re: QPluginLoader не может load() вне QtCreator
Отправлено: crackedmind от Март 04, 2010, 19:32
Винда, если не ошибаюсь еще со времен 2000 винды, поддерживает "никсовые" слэши в именах файлов.

1. скомпилить приложение с CONFIG+=console
2. выставить set QT_DEBUG_PLUGINS=1
3. запустить
4. почитать что вывелось.



Название: Re: QPluginLoader не может load() вне QtCreator
Отправлено: digited от Март 04, 2010, 20:02
Выводится что-то постороннее, нужного не видно: http://pastebin.com/k0ejXqY8

(я правильно понял насчет set?)


Название: Re: QPluginLoader не может load() вне QtCreator
Отправлено: ритт от Март 06, 2010, 02:11
т.е. собираем одной версией, а грузим из другой, да?


Название: Re: QPluginLoader не может load() вне QtCreator
Отправлено: digited от Март 09, 2010, 17:32
Нет, один и тот же релизный билд приложения и плагинов, дллки кьюта для отдельного запуска взяты из qt/bin


Название: Re: QPluginLoader не может load() вне QtCreator
Отправлено: кып от Март 10, 2010, 12:51
У меня вот тут http://www.prog.org.ru/topic_12645_0.html (http://www.prog.org.ru/topic_12645_0.html) была похожая проблема, правда без креатора.
И сообщение
Код:
"The plugin 'C:/Qt/2009.05/qt/plugins/iconengines/qsvgicon4.dll' uses incompatible Qt library. (Cannot mix debug and release libraries.)"
как бы говорит о о том что версии приложения и плагинов разные, одна release, другая debug.


Название: Re: QPluginLoader не может load() вне QtCreator
Отправлено: digited от Март 11, 2010, 13:37
Это кьют грузит свои плагины, они там, видимо, собраны под разные конфиги - что-то грузится, что-то - нет. Лично мои плагины таких сообщений не вызывают, все точно собрано под один конфиг и запускается одно и то же приложение - сначала из-под креатора, где все плагины находятся (я вывожу пути к файлам в логи), затем - мышекликом (запуском руками), опять же пути к файлам плагинов, передаваемые QPluginLoader'у, те же (вывожу messagebox'ом), но он их не грузит с вышеописанной ошибкой.


Название: Re: QPluginLoader не может load() вне QtCreator
Отправлено: кып от Март 12, 2010, 12:54
И все таки
Цитировать
В реестре в plugin cache.false никакой разницы c успешными загрузками не пишется (кроме 0 в одном месте), все собираю в релизе.

А ошибки о невозможности смешивать разные версии идут при попытке загрузить куте-шные плагины именно релиз версии (см выделенное жирным), а дебаг грузятся нормально. Т.е. приложение собрано в дебаг версии.

Хотя это может и не имеет отношения к проблеме.
Покажи строку загрузки своего плагина.