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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [решено] Не работает qt.conf  (Прочитано 10920 раз)
lzv
Гость
« : Апрель 12, 2013, 18:44 »

Здравствуйте.

Система windows xp, Qt версии 4.8.

Пытаюсь перенести приложение на компьютер без Qt. Но в приложении используется SQLite. Если положить файл qsqlite4.dll в тот же каталог, где он был при компиляци программы (С:\Qt\4.8.4\plugins\sqldrivers\), то программа работает. Во всех других случаях - если положить его рядом с exe-шником, либо в подкаталог sqldrivers, либо вообще в plugins\sqldrivers - не работает.
Пробую использовать qt.conf, но он не подхватывается. Ложил его рядом с exe-ником, а так же пробовал поместить в ресурсы в префикс /qt/etc/ но не работает.
Проверяю пути с помощью QLibraryInfo::location, они не меняются.

Подскажите пожалуйста, как добраться до этого пути загрузки плагинов, где его поменять.
« Последнее редактирование: Апрель 13, 2013, 19:47 от lzv » Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #1 : Апрель 12, 2013, 19:21 »

что-то у тебя не так, у всех sqlite работает, а у тебя нет. Правильный подкаталог, куда класть qsqlite - sqldrivers/. Вся остальная инфа бесполезна, опиши подробно как и что ты делаешь.
Записан
lzv
Гость
« Ответ #2 : Апрель 12, 2013, 20:56 »

Вот содержимое файла main.cpp:
Код:
#include <QtGui>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QTextCodec* codec = QTextCodec::codecForName("UTF-8");
    QTextCodec::setCodecForTr(codec);
    QTextCodec::setCodecForCStrings(codec);
    QTextCodec::setCodecForLocale(codec);

    QString sys_lang = QLocale::system().name();
    QTranslator translator;
    if (sys_lang == "ru_RU" || sys_lang == "ru") {
translator.load("lang_ru", QCoreApplication::applicationDirPath());
a.installTranslator(& translator);
    }

    QFile llog(QCoreApplication::applicationDirPath() + "/llog.txt");
    llog.open(QIODevice::ReadWrite);

    llog.write(QString("PrefixPath: ").toAscii());
    llog.write(QLibraryInfo::location(QLibraryInfo::PrefixPath).toAscii());
    llog.write(QString("\n").toAscii());

    llog.write(QString("DocumentationPath: ").toAscii());
    llog.write(QLibraryInfo::location(QLibraryInfo::DocumentationPath).toAscii());
    llog.write(QString("\n").toAscii());

    llog.write(QString("HeadersPath: ").toAscii());
    llog.write(QLibraryInfo::location(QLibraryInfo::HeadersPath).toAscii());
    llog.write(QString("\n").toAscii());

    llog.write(QString("LibrariesPath: ").toAscii());
    llog.write(QLibraryInfo::location(QLibraryInfo::LibrariesPath).toAscii());
    llog.write(QString("\n").toAscii());

    llog.write(QString("BinariesPath: ").toAscii());
    llog.write(QLibraryInfo::location(QLibraryInfo::BinariesPath).toAscii());
    llog.write(QString("\n").toAscii());

    llog.write(QString("PluginsPath: ").toAscii());
    llog.write(QLibraryInfo::location(QLibraryInfo::PluginsPath).toAscii());
    llog.write(QString("\n").toAscii());

    llog.write(QString("ImportsPath: ").toAscii());
    llog.write(QLibraryInfo::location(QLibraryInfo::ImportsPath).toAscii());
    llog.write(QString("\n").toAscii());

    llog.write(QString("DataPath: ").toAscii());
    llog.write(QLibraryInfo::location(QLibraryInfo::DataPath).toAscii());
    llog.write(QString("\n").toAscii());

    llog.write(QString("TranslationsPath: ").toAscii());
    llog.write(QLibraryInfo::location(QLibraryInfo::TranslationsPath).toAscii());
    llog.write(QString("\n").toAscii());

    llog.write(QString("SettingsPath: ").toAscii());
    llog.write(QLibraryInfo::location(QLibraryInfo::SettingsPath).toAscii());
    llog.write(QString("\n").toAscii());

    llog.write(QString("ExamplesPath: ").toAscii());
    llog.write(QLibraryInfo::location(QLibraryInfo::ExamplesPath).toAscii());
    llog.write(QString("\n").toAscii());

    llog.write(QString("DemosPath: ").toAscii());
    llog.write(QLibraryInfo::location(QLibraryInfo::DemosPath).toAscii());
    llog.write(QString("\n").toAscii());

    llog.close();

    MainWindow w;
    w.show();
   
    return a.exec();
}

Содержимое qt.conf, например такое:
Код:
[Paths]
Prefix = c:/my_projects/build-Qtimer-Desktop-Release/release/
Plugins = ppppp


Включаю файл qt.conf в ресурсы по префиксу /qt/etc/
Компилирую, получаю exe, копирую его в другую папку, с ним ложу QtCore4.dll, QtGui4.dll и QtSql4.dll. Затем запускаю. Получаю файл llog.txt:
Код:
PrefixPath: C:\Qt\4.8.4
DocumentationPath: C:\Qt\4.8.4\doc
HeadersPath: C:\Qt\4.8.4\include
LibrariesPath: C:\Qt\4.8.4\lib
BinariesPath: C:\Qt\4.8.4\bin
PluginsPath: C:\Qt\4.8.4\plugins
ImportsPath: C:\Qt\4.8.4\imports
DataPath: C:\Qt\4.8.4
TranslationsPath: C:\Qt\4.8.4\translations
SettingsPath: C:/Qt/4.8.4
ExamplesPath: C:\Qt\4.8.4\examples
DemosPath: C:\Qt\4.8.4\demos

Удаляю llog.txt. Ложу qt.conf рядом с exe-шником, запускаю. Содержимое llog.txt то же самое.
Удаляю llog.txt. Удаляю ресурсы, компилирую. Заменяю exe-шник, файл qt.conf рядом с ним. Запускаю. Содержимое llog.txt то же самое.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #3 : Апрель 12, 2013, 21:01 »

не нужен тебе qt.conf для sqlite плагина, нужно дебажить почему он на целевой системе не погружается. Компилятор mingw? Покажи структуру каталогов программы на целевой системе.
Записан
lzv
Гость
« Ответ #4 : Апрель 12, 2013, 21:09 »

Компилятор VS 2010.
Не подгружается, потому что qsqlite4.dll ищется в каталоге, где он был при компиляции программы. Если его туда положить, то все работает.
Структура простая - все файлы в одном каталоге.
Записан
Bepec
Гость
« Ответ #5 : Апрель 12, 2013, 21:16 »

Я те по секрету скажу. То, что он ищет плагины ещё и по qt.conf не значит, что пути для приложения изменяются Улыбающийся

Должно работать. Нарушить эту часть Qt практически невозможно Веселый Скинь файл программы с дллками и дллкой плагины, вот и посмотрим что не работает Веселый
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #6 : Апрель 12, 2013, 21:17 »

Не подгружается, потому что qsqlite4.dll ищется в каталоге, где он был при компиляции программы.

Нет, путь где он был при компиляции - это один из путей поиска, но не единственный.

Структура простая - все файлы в одном каталоге.

плагин на целевой системе лежит в подкаталоге sqldrivers?
Записан
lzv
Гость
« Ответ #7 : Апрель 12, 2013, 21:26 »

плагин на целевой системе лежит в подкаталоге sqldrivers?

Пробовал по разному -  в папке exe-шника, в sqldrivers, в plugins\sqldrivers. Не работает ни в одном случае.
Записан
lzv
Гость
« Ответ #8 : Апрель 12, 2013, 21:38 »

Попробовал взять QtCore4.dll, QtGui4.dll и QtSql4.dll не из дистрибутива Qt а из дистрибутива Qt Creator. Компилировал программу в прежних условиях, эти dll нужны только при запуске уже готового exe-файла.
После замены dll пути стали такими:
Код:
PrefixPath: q:\install\qt-4.8.4
DocumentationPath: q:\install\qt-4.8.4\doc
HeadersPath: q:\install\qt-4.8.4\include
LibrariesPath: q:\install\qt-4.8.4\lib
BinariesPath: q:\install\qt-4.8.4\bin
PluginsPath: C:\Qt\qtcreator-2.7.0\plugins
ImportsPath: C:\Qt\qtcreator-2.7.0\bin
DataPath: q:\install\qt-4.8.4
TranslationsPath: q:\install\qt-4.8.4\translations
SettingsPath: q:/install/qt-4.8.4
ExamplesPath: q:\install\qt-4.8.4\examples
DemosPath: q:\install\qt-4.8.4\demos

(Хотя вроде я не замечал в системе диска q: Но те что начинаются с C: - существуют)

qt.conf так же ни на что не влияет. И так же пробовал по разному положить драйвер.
Видимо как то в этих dll прописывается путь при установке Qt и Creator-а.

 Непонимающий
« Последнее редактирование: Апрель 12, 2013, 21:42 от lzv » Записан
Bepec
Гость
« Ответ #9 : Апрель 12, 2013, 22:05 »

Я те по секрету скажу. То, что он ищет плагины ещё и по qt.conf не значит, что пути для приложения изменяются Улыбающийся

Должно работать. Нарушить эту часть Qt практически невозможно Веселый Скинь файл программы с дллками и дллкой плагины, вот и посмотрим что не работает Веселый
Записан
lzv
Гость
« Ответ #10 : Апрель 13, 2013, 01:30 »

Скачать можно здесь https://github.com/lzv/qtimer/tree/master/installs
файл "qtimer for windows xp 32 bit.7z"
Там dll из дистрибутива самой Qt.
Каталогом выше сами исходники.

Без драйвера сама программа запускается, он задействуется при открытии файла данных и работе с ним.
« Последнее редактирование: Апрель 13, 2013, 01:34 от lzv » Записан
Bepec
Гость
« Ответ #11 : Апрель 13, 2013, 08:40 »

http://spolab.ru/blog/80-neponyatki-s-plaginami-qt
Записан
lzv
Гость
« Ответ #12 : Апрель 13, 2013, 16:14 »

addLibraryPath тоже не помогает. Устанавливал как относительный путь (с точкой) так и абсолютный (получаемый через QCoreApplication::applicationDirPath()).
Так же пробовал setLibraryPaths.
Записан
Serr500
Гость
« Ответ #13 : Апрель 13, 2013, 17:02 »

http://files.mail.ru/86D9A947688A4AC58A63D14A84788E0C

Собрано, правда, не MSVC, а MinGW, но это несущественно. Там же парочка исходных файлов, которые я изменил.

Если вкратце, то проблемы из-за того, что у Вас переменные типа QSqlDatabase объявлены как static. В этом случае они инициализируются слишком рано и все попытки поиска плагинов в других каталогах происходят уже после их инициализации. Я перенёс инициализацию в конструктор и всё заработало.
Записан
lzv
Гость
« Ответ #14 : Апрель 13, 2013, 19:45 »

Serr500 спасибо, работает!
Спасибо так же и все остальным, кто пытался помочь  Улыбающийся
« Последнее редактирование: Апрель 13, 2013, 19:47 от lzv » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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