Seite 1 von 1
[gelöst] QSqlDatabase: QPSQL driver not loaded
Verfasst: 15. Juni 2009 15:32
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.
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
Verfasst: 15. Juni 2009 20:17
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.....
Verfasst: 16. Juni 2009 08:51
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.
Verfasst: 16. Juni 2009 08:54
von solarix
Das ist kein Pfad, das ist richtig. Habe es aber auch schon ohne den Dateinamen probiert, jedoch ohne Erfolg.
Welchen?
Verfasst: 16. Juni 2009 09:08
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/
Verfasst: 16. Juni 2009 09:27
von franzf
Eigentlich sollte Qt seine libraryPaths() schon kennen...
Kannst du mal bitte ein ganz simples Programm schreiben und da nur den Inhalt von
ausgeben?
Was gibt
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.
Verfasst: 16. Juni 2009 09:41
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
ausgeben?
Was gibt
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:
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.
Verfasst: 16. Juni 2009 09:57
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.
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.
Verfasst: 16. Juni 2009 12:39
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"?
Verfasst: 16. Juni 2009 14:04
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