LINUX.ORG.RU

[Offtop] Qt4: QSQLITE driver not loaded


0

1

Понадобилось недавно адаптировать свою мелкую программу для запуска под offtop'ом без установленного Qt. Проект легко скомпилился, нужные либы от Qt кинул в корень папки с exe, но при запуске программа не может подхватить qsqlite4.dll. Если плагин для sqlite лежит в папке Qt4:Qt/4.8.0/plugins/sqldrivers все работает. Переименовываю данную папку, кидаю в корень своего приложения подпапку sqldrivers с нужным плагином и получаю «QSQLITE driver not loaded». Много гуглил, работающего решения не нашол. Подскажите как решить проблему.


Ответ на: комментарий от fluorite

пробовал, к сожалению и это не помогает. Я как понял проблема в том, что адреса подключения плагинов жестко завязаны на QTDIR, осталось QtCore объяснить где лежит папка с плагином, но что то не получается пробовал «qApp->addLibrayPath», так вроде.

nand ()
Ответ на: комментарий от fluorite

Сначала объявляю:

QSqlDatabase mydb =  QSqlDatabase::addDatabase("QSQLITE");
QSqlQuery* query;

openFile - обработчик события File->Open->выбор файла БД

void MainWindow::openFile()
{
    QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"),".uft",tr("UPOS File Test(*.uft)\n"));
    if (!fileName.isEmpty())

    mydb.setDatabaseName(fileName);
    if(mydb.isValid())
    {
       mydb.open();
       query = new QSqlQuery();

       query->exec("SELECT COUNT(*) FROM student");
        if ( ! query->isActive() )
            QMessageBox::warning(this, tr("Database Error"),
            query->lastError().text() );

        else
        {
            while ( query->next() )
            {
                 nums    = query->value(0).toInt();
            }

            ui->label_2->setText(QString( "%1" ).arg(nums));
            ui->progressBar->setVisible(true);
            ui->pushButton_1 ->setVisible(true);
            ui->label_2      ->setVisible(true);
        }
    }
    else QMessageBox::warning(this, tr("Database Error"),
                              query->lastError().text() );
}

Повторюсь, этот код работает если драйвер qsqlite лежит в родной папке Qt, мне необходимо подключать его из своей папки.

nand ()
Ответ на: комментарий от alex_custov

Я видел это, правильно ли я понимаю, что для статической линковки этого драйвера нужно собирать Qt с опцией static? И возможно дли подцепить драйвер без его пересборки? Он же есть откомпилированный и работает, если лежит у себя в родной папке...

nand ()
Ответ на: комментарий от namezys

я это осознал давно, просто пытаюсь у народа спросить как это сделать, но получается плохо)

nand ()

В завалах кода, который я когда-то рожал нашел следующее, может поможет:

QStringList listPath;
QDir dir = QDir(qApp->applicationDirPath() + "/./");
listPath << dir.absolutePath() << app.libraryPaths();
app.setLibraryPaths(listPath);

в папке с твоим exe должна быть папка «sqldrivers» в которой и должны лежать драйвера (кажись qsqlite4.dll)...

SSZB ()
Ответ на: комментарий от nand

рядом с exe создай файлик

$ cat qt.conf 
[Paths]
Plugins = ./plugins
относительно exe вот такой должен быть путь до dll plugins/sqldrivers/qsqlite4.dll

dhampire ★★★ ()

По умолчанию без указывания пути к плагинам, плагины к базе данных должны быть в директории sqldrivers.

...
app.exe
QtSql4.dll
sqldrivers
|
+\->qsqlite4.dll
...

Fastman ()
Ответ на: комментарий от Fastman

я в самом начале написал, что такой вариант не работает

nand ()

Шайтан, не иначе! Чисто ради абстрактного интереса:

У тебя самосборная Qt? Ассистент работает?

Когда я первый раз собрал Qt 4.8.0 (MinGW, gcc 4.6.1), то Ассистент не взлетел. Писал «Файл словаря не найден» или что-то типа того... Гугл сказал — это проблема с sqlite, и нужно конфигурировать Qt с флагом -plugin-sql-sqlite. После пересборки все заработало.

SSZB ()
Ответ на: комментарий от SSZB

С этим у ТС должно быть всё в порядке, иначе откуда бы он взял qsqlite4.dll.

com ()
Ответ на: комментарий от SSZB

Qt ставил собранную, там Ассистент тоже не запускается «Ошибка чтения файла коллекции словаря....», но взаимосвязи моей проблемы и этой не вижу.

nand ()
Ответ на: комментарий от alex_custov

увы из вывода straceNT я не понял как определить откуда он хватает либу

nand ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.