[gelöst] QSqlDatabase: QPSQL driver not loaded

Alles rund um die Programmierung mit Qt
Antworten
ms47
Beiträge: 35
Registriert: 22. Januar 2009 10:02

[gelöst] QSqlDatabase: QPSQL driver not loaded

Beitrag von ms47 »

Hallo,

ich komme einfach nicht weiter mit meinem Problem.
Ich habe eine Anwendung, mit der ich auf eine Postgresql-Datenbank zugreifen möchte. Auf meinem Rechner (Ubuntu 9.04) klappt das soweit auch. Möchte ich das auf einem anderen Rechner machen (Ubuntu 8.04) bekomme ich nur eine Fehlermeldung.

Code: Alles auswählen

QSqlDatabase: QPSQL driver not loaded
Lasse ich mir die verfügbaren Treiber anzeigen, wird auf dem Fehler-Rechner nichts angezeigt und das gleiche Programm auf dem anderen Rechner gibt mir eine entsprechende Liste aus.

Im Verzeichnis /opt/qtsdk-2009.01/qt/plugins/sqldrivers/ habe ich bei beiden Rechnern den Treiber libqsqlpsql.so liegen.

Probiert hatte ich es mit folgenden Varianten:

Code: Alles auswählen

QCoreApplication a(argc, argv);
a.addLibraryPath("/opt/qtsdk-2009.01/qt/plugins/sqldrivers/libqsqlpsql.so");
und

Code: Alles auswählen


QPluginLoader l;
l.setFileName("/opt/qtsdk-2009.01/qt/plugins/sqldrivers/libqsqlpsql.so");
l.load();
qDebug() << l.isLoaded();
Beides jedoch ohne Erfolg.
Wie bekomme ich jetzt dieses spezielle Plugin geladen?
Bitte habt Erbarmen und gebt Tipps. Bin für jeden Tipp dankbar.

Gruß
Markus
Zuletzt geändert von ms47 am 16. Juni 2009 14:21, insgesamt 1-mal geändert.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Naja.. da kann natürlich recht viel verkehrt sein.. wichtig wären folgende zwei Punkte:

1. Das Plugin selbst ist evt. gegen weitere Libraries gelinkt, welche natürlich vorhanden sein müssen. Dies kannst du prüfen mit "ldd libqsqlpsql.so" (Ausgabe durchschauen, da müssen alle Links aufgelöst sein)

2. "/opt/qtsdk-2009.01/qt/plugins/sqldrivers/libqsqlpsql.so" ist kein Pfad.....
ms47
Beiträge: 35
Registriert: 22. Januar 2009 10:02

Beitrag von ms47 »

solarix hat geschrieben:Naja.. da kann natürlich recht viel verkehrt sein.. wichtig wären folgende zwei Punkte:

1. Das Plugin selbst ist evt. gegen weitere Libraries gelinkt, welche natürlich vorhanden sein müssen. Dies kannst du prüfen mit "ldd libqsqlpsql.so" (Ausgabe durchschauen, da müssen alle Links aufgelöst sein)

2. "/opt/qtsdk-2009.01/qt/plugins/sqldrivers/libqsqlpsql.so" ist kein Pfad.....
Danke für deine Antwort,

folgende Ausgaben für die ldd:

ldd plugins/sqldrivers/libqsqlpsql.so

Code: Alles auswählen

        linux-gate.so.1 =>  (0xf7f9d000)
        libpq.so.5 => /usr/lib/libpq.so.5 (0xf7f59000)
        libQtSql.so.4 => /opt/qtsdk-2009.01/qt/lib/libQtSql.so.4 (0xf7f1c000)
        libQtCore.so.4 => /opt/qtsdk-2009.01/qt/lib/libQtCore.so.4 (0xf7cc8000)
        libgthread-2.0.so.0 => /usr/lib/libgthread-2.0.so.0 (0xf7cc3000)
        librt.so.1 => /lib/tls/i686/cmov/librt.so.1 (0xf7cba000)
        libglib-2.0.so.0 => /usr/lib/libglib-2.0.so.0 (0xf7c09000)
        libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xf7c05000)
        libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xf7bec000)
        libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xf7af9000)
        libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xf7ad4000)
        libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xf7ac9000)
        libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xf797a000)
        libssl.so.0.9.8 => /usr/lib/i686/cmov/libssl.so.0.9.8 (0xf7938000)
        libcrypto.so.0.9.8 => /usr/lib/i686/cmov/libcrypto.so.0.9.8 (0xf77f5000)
        libkrb5.so.3 => /usr/lib/libkrb5.so.3 (0xf7768000)
        libcom_err.so.2 => /lib/libcom_err.so.2 (0xf7765000)
        libgssapi_krb5.so.2 => /usr/lib/libgssapi_krb5.so.2 (0xf773c000)
        libcrypt.so.1 => /lib/tls/i686/cmov/libcrypt.so.1 (0xf770a000)
        libldap_r-2.4.so.2 => /usr/lib/libldap_r-2.4.so.2 (0xf76cb000)
        libselinux.so.1 => /lib/libselinux.so.1 (0xf76b1000)
        /lib/ld-linux.so.2 (0xf7f9e000)
        libpcre.so.3 => /usr/lib/libpcre.so.3 (0xf768a000)
        libz.so.1 => /usr/lib/libz.so.1 (0xf7675000)
        libk5crypto.so.3 => /usr/lib/libk5crypto.so.3 (0xf7652000)
        libkrb5support.so.0 => /usr/lib/libkrb5support.so.0 (0xf764a000)
        libkeyutils.so.1 => /lib/libkeyutils.so.1 (0xf7646000)
        libresolv.so.2 => /lib/tls/i686/cmov/libresolv.so.2 (0xf7633000)
        liblber-2.4.so.2 => /usr/lib/liblber-2.4.so.2 (0xf7626000)
        libsasl2.so.2 => /usr/lib/libsasl2.so.2 (0xf760f000)
        libgnutls.so.13 => /usr/lib/libgnutls.so.13 (0xf759a000)
        libtasn1.so.3 => /usr/lib/libtasn1.so.3 (0xf7589000)
        libgcrypt.so.11 => /lib/libgcrypt.so.11 (0xf753c000)
        libgpg-error.so.0 => /lib/libgpg-error.so.0 (0xf7538000)
ldd ./main

Code: Alles auswählen

        linux-gate.so.1 =>  (0xf7f43000)
        libQtSql.so.4 => /opt/qtsdk-2009.01/qt/lib/libQtSql.so.4 (0xf7f04000)
        libQtCore.so.4 => /opt/qtsdk-2009.01/qt/lib/libQtCore.so.4 (0xf7cb1000)
        libgthread-2.0.so.0 => /usr/lib/libgthread-2.0.so.0 (0xf7c9b000)
        librt.so.1 => /lib/tls/i686/cmov/librt.so.1 (0xf7c92000)
        libglib-2.0.so.0 => /usr/lib/libglib-2.0.so.0 (0xf7be1000)
        libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xf7bdd000)
        libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xf7bc5000)
        libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xf7ad2000)
        libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xf7aac000)
        libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xf7aa1000)
        libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xf7952000)
        libselinux.so.1 => /lib/libselinux.so.1 (0xf7939000)
        /lib/ld-linux.so.2 (0xf7f44000)
        libpcre.so.3 => /usr/lib/libpcre.so.3 (0xf7912000)
Soweit ich sehen kann, fehlen dort keine Abhängigkeiten und auf die gleichen Libs von Qt wird auch verwiesen.

Das ist kein Pfad, das ist richtig. Habe es aber auch schon ohne den Dateinamen probiert, jedoch ohne Erfolg.

Sonst noch irgendwelche Tipps die ich probieren könnte? Danke schon mal.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Das ist kein Pfad, das ist richtig. Habe es aber auch schon ohne den Dateinamen probiert, jedoch ohne Erfolg.
Welchen?
ms47
Beiträge: 35
Registriert: 22. Januar 2009 10:02

Beitrag von ms47 »

solarix hat geschrieben:
Das ist kein Pfad, das ist richtig. Habe es aber auch schon ohne den Dateinamen probiert, jedoch ohne Erfolg.
Welchen?
Habe diese Pfade durchprobiert:
/opt
/opt/qtsdk-2009.01
/opt/qtsdk-2009.01/qt
/opt/qtsdk-2009.01/qt/plugins
/opt/qtsdk-2009.01/qt/plugins/sqldrivers
/opt/
/opt/qtsdk-2009.01/
/opt/qtsdk-2009.01/qt/
/opt/qtsdk-2009.01/qt/plugins/
/opt/qtsdk-2009.01/qt/plugins/sqldrivers/
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Eigentlich sollte Qt seine libraryPaths() schon kennen...
Kannst du mal bitte ein ganz simples Programm schreiben und da nur den Inhalt von

Code: Alles auswählen

QCoreApplication::libraryPaths()
ausgeben?
Was gibt

Code: Alles auswählen

$ qmake -query "QT_INSTALL_PREFIX"
Ich kann mir vorstellen, dass das qmake, mit dem du dein Projekt erstellen willst, nicht das aus /opt/qt-sdk-xyz ist, du also irgendwie mehrere Qt-Installationen auf deiner Platte hast.
ms47
Beiträge: 35
Registriert: 22. Januar 2009 10:02

Beitrag von ms47 »

franzf hat geschrieben:Eigentlich sollte Qt seine libraryPaths() schon kennen...
Kannst du mal bitte ein ganz simples Programm schreiben und da nur den Inhalt von

Code: Alles auswählen

QCoreApplication::libraryPaths()
ausgeben?
Was gibt

Code: Alles auswählen

$ qmake -query "QT_INSTALL_PREFIX"
Ich kann mir vorstellen, dass das qmake, mit dem du dein Projekt erstellen willst, nicht das aus /opt/qt-sdk-xyz ist, du also irgendwie mehrere Qt-Installationen auf deiner Platte hast.
die Library-Path sind

Code: Alles auswählen

("/opt/qtsdk-2009.01/qt/plugins/sqldrivers", "/opt/qtsdk-2009.01/qt/plugins", "/opt/qtsdk-2009.01/qt", "/opt/qtsdk-2009.01", "/opt", "/tmp")
Das qmake ist aber das aus dem /opt-Verzeichnis, da ich es auch so aufgerufen habe:

Code: Alles auswählen

/opt/qtsdk-2009.01/qt/bin/qmake
Vielleicht schildere ich mal den kompletten Sachverhalt:
Ich habe ein Programm, dass ich natürlich auf meinem PC mit Qt 4.5.1 im besagten Verzeichnis installiert habe.
Nun soll dieses Programm (Shared-Libs) auf einem Ubuntu 8.04 laufen. Dort besteht keine Möglichkeit, die Qt-Pakete aus den Repositorys zu installieren und es ist nur Qt 3-Version verfügbar. Also habe ich die Libs auch dort in das besagte Verzeichnis kopiert. Anwendungen ohne Zugriff auf die Datenbank funktionieren und es werden auch die Libs aus dem Verzeichnis genommen (kontrolliert per ldd). Nur mit dem Plugin und somit der Zugriff auf die Datenbank funktioniert nicht.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

ms47 hat geschrieben:Nun soll dieses Programm (Shared-Libs) auf einem Ubuntu 8.04 laufen. Dort besteht keine Möglichkeit, die Qt-Pakete aus den Repositorys zu installieren und es ist nur Qt 3-Version verfügbar.
:shock:
Auch keine externen REPOs?
Lad doch dann einfach mal das psql-plugin und gibt den letzten QPluginLoader::errorString() aus.
Ich kann mir vorstellen, dass da eine abhängige lib nicht binär kompatibel zum Plugin ist.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Eigentlich sollte Qt seine libraryPaths() schon kennen...
Ja.. wobei mir diese hardcodierten Pfade nicht behagen.. ich verwende auf einem "Nicht-Entwicklungssystem" lieber die Umgebungsvariabel "QT_PLUGIN_PATH"
Ich kann mir vorstellen, dass da eine abhängige lib nicht binär kompatibel zum Plugin ist.
Wuerde ich auch tippen.. evt. hilft ja die Ausgabe von "QT_DEBUG_PLUGINS"?

Code: Alles auswählen

  $ export QT_DEBUG_PLUGINS=1
  $ ./myprog
ms47
Beiträge: 35
Registriert: 22. Januar 2009 10:02

Beitrag von ms47 »

franzf hat geschrieben: Ich kann mir vorstellen, dass da eine abhängige lib nicht binär kompatibel zum Plugin ist.
Schande über mein Haupt. Der oben aufgeführte Satz hat mich erst weiter gebracht. Hätte allerdings durch die vorher aufgeführten Ratschläge und eigentlich auch von selber drauf kommen müssen. Naja, egal. Jetzt läuft es.

Ich benötige für das Prog drei Libs und das eine Plugin. Das ldd zeigte immer den Verweis auf libQtCore.so.4, libQtNetwork.so.4 und libQtSql.so.4.
Was ich allerdings nie getestet hatte war ein ldd libQtCore.so.4. Da zeigte sich das Übel, allerdings nur indirekt. die libQtCore.so.4 war leider nur ein Link auf die Datei libQtCore.so.4.5.0. Für den Sql-Kram war allerdings schon die Version 4.5.1 vorhanden, also ein Versionskonflikt.

Also nochmal kurz für alle:

Code: Alles auswählen

ls -al /opt/qtsdk-2009.01/qt/lib/
lrwxrwxrwx 1 user user      18 2009-06-16 13:45 libQtCore.so.4 -> libQtCore.so.4.5.1
-rwxr-xr-x 1 user user 2774974 2009-06-16 13:42 libQtCore.so.4.5.1
lrwxrwxrwx 1 user user      18 2009-06-16 13:45 libQtNetwork.so.4 -> libQtCore.so.4.5.1
-rwxr-xr-x 1 user user 1407699 2009-06-16 13:42 libQtNetwork.so.4.5.1
lrwxrwxrwx 1 user user      17 2009-06-16 13:45 libQtSql.so.4 -> libQtSql.so.4.5.1
-rwxr-xr-x 1 user user  300072 2009-06-16 13:42 libQtSql.so.4.5.1


ls -al /opt/qtsdk-2009.01/qt/plugins/sqldrivers/
-rwxr-xr-x 1 user user  523987 2009-06-16 13:42 libqsqlpsql.so
Im Programm dann folgendes angegeben:

Code: Alles auswählen

QCoreApplication a(argc, argv);
a.addLibraryPath( "/opt/qtsdk-2009.01/qt/plugins" );
qDebug() << QSqlDatabase::drivers();
QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
Und es funktioniert.

Ich bedanke mich nochmal recht herzlich für eurer Bemühen.

Gruß
Markus
Antworten