Seite 1 von 1

Zugriff auf Datenbank mit statischer Qt-Lib klappt nicht

Verfasst: 31. Januar 2007 18:22
von heisp
Hallo liebe Forumgemeinde,

dies ist mein erster Beitrag hier - allerdings lese ich schon seit längerer Zeit vielen interessante Beiträge.

Ich habe eine Applikation geschrieben, die im Backend eine PostgreSQL Datenbank verwendet. Die Entwicklung lief gegen eine dynamische Qt-Lib, die zur Laufzeit viele Qt-DLLs benötigt.

Jetzt brauche ich eine statische Version von meinem Programm und habe deshalb die Qt Bibs statisch übersetzt. Dabei bin ich wie folgt vorgegangen:

http://doc.trolltech.com/4.1/deployment ... ic-linking

Als weiteren Parameter bei configure habe ich noch mitgeteilt, dass ich die PostgreSQL Datenbank verwenden möchte (-qt-sql-psql). Die Lib wurde neu kompiliert und ich kann mein Programm auch einwandfrei übersetzen.

Doch folgender Aufruf ziemlich zu Beginn des Programms liefert eine leere Liste:

Code: Alles auswählen

QStringList drivers = QSqlDatabase::drivers();
Zurück zu meiner dynamischen Version stelle ich fest, dass diese Variante problemlos funktioniert. Mir gehen jetzt nach und nach die Ideen aus und ich würde gerne wissen, ob ich irgendwie ermitteln kann ob das statische System die nötigen Treiber eigentlich finden müsste. Welche Dateien müssten wo vorhanden sein? Ein Vergleich zwischen meiner dynamischen und statischen Ordnerstruktur haben leider keine Ergebnisse geliefert aber vllt. habe ich auch etwas übersehen...

System:
WinXP
PostgreSQL 8.0.1
Qt 4.1.1

Vielen Dank für Eure Bemühungen.
--Heiko

Verfasst: 31. Januar 2007 18:32
von Christian81
Da Plugins in der statischen Version nicht funktionieren (wie auch) musst Du den SQL-Treiber mit hinzulinken. Steht auch irgendwo in der Doku

Verfasst: 1. Februar 2007 09:55
von heisp
Christian81 hat geschrieben:Da Plugins in der statischen Version nicht funktionieren (wie auch) musst Du den SQL-Treiber mit hinzulinken. Steht auch irgendwo in der Doku
Danke für die schnelle Antwort.
Allerdings bin ich jetzt doch ein bisschen verunsichert:

Hier steht, dass man unbedingt die dynamische Version von Qt benutzen muss.

Hier steht jedoch, dass psql als statische Plugin zur Verfügung steht.

Irgendwas bring ich da doch durcheinander, oder?
Ich habe die Tipps aus dem Link von Christian81 befolgt, erhalte allerdings die Linker-Fehlermeldung

Code: Alles auswählen

 
AuthoServ error LNK2001: unresolved external symbol "public: static struct QMetaObject const QSqlDriver::staticMetaObject" (?staticMetaObject@QSqlDriver@@2UQMetaObject@@B)
Danke,
--Heiko

Verfasst: 1. Februar 2007 10:10
von Christian81
Nunja - ein Plugin ist nunmal eine externe lib - und diese geht nur mit einem dynamisch kompilierten Qt.
'Statisches Plugin' ist demnach etwas falsch ausgedrückt - die Plugin-Funktionalität ist ja nicht vorhanden. Dafür wird das Plugin direkt gelinkt (und ist dadurch kein Plugin mehr)

Hast Du das statische Plugin auch wie im Text beschrieben eingebunden?

Verfasst: 1. Februar 2007 10:31
von heisp
Ja ich habe es wie in der von Dir verlinkten Doku eingebunden. Wenn ich das nicht machen würde, läuft der Linker sauber durch - zur Laufzeit sind dann aber keine Treiber vorhanden.
Muss ich denn bei der Erstellung der Datenbank-Lib im statischen Modus etwas Besonderes machen?
Habe bisher immer folgendes ausgeführt (auch nachdem ich die statischen Libs übersetzt habe):

Code: Alles auswählen

  cd %QTDIR%\src\plugins\sqldrivers\psql
     qmake -o Makefile "INCLUDEPATH+=C:\psql\include" "LIBS+=C:\psql\lib\ms\libpq.lib" psql.pro
     nmake
Aber Du meinst, dass mein Vorhaben generell möglich sein sollte, ja?

Verfasst: 1. Februar 2007 10:45
von Christian81
Probiere es doch einfach mal mit etwas einfachen wie dem jpeg-Plugin aus. Ersetze dann jpeg durch sql und schau was passiert. Ihr müsst echt lernen kleine Testcases zu bauen.

Verfasst: 1. Februar 2007 11:02
von heisp
Aber das bringt mir im dem Fall doch garnichts. Es steht doch die Frage im Raum ob eine Datenbankanbindung statisch gelinkt werden kann. Welche Ergebnisse erhoffst Du Dir von dem Test denn? Und was machst Du in den beiden Fällen (funktioniert/funktioniert nicht)? Da die Linkermeldung schon sehr DB-spezifisch ist würde ich gerne an dieser Stelle weiter schauen. Weitere Tipps?

Verfasst: 1. Februar 2007 11:07
von Christian81
Es funktioniert, aber in deinem Programm ist irgendwo ein Fehler. Um diesen einzugrenzen sollte man ein Testcase bauen (das übersichtlich ist) und schauen ob es dann funktioniert. Um den Fehler in deiner sql-lib auszuschließen würde ich deshalb erstmal mit einem anderen anfangen (welches keine externen Abhängigkeiten hat). Wenn das dann funktioniert kann man es mal mit sql probieren und weiter schauen.
Was ist daran so schwer zu verstehen?