Seite 1 von 1
[gelöst] CMAKE und QMYSQLDRIVER
Verfasst: 27. Januar 2011 12:12
von Mensch
Hallo zusammen,
ich habe eine Frage zur Nutzung der QSqlDriver mittels CMAKE. Ich habe folgende CMakeLists.txt (nur die Ausschnitte die mein Problem betreffen):
Code: Alles auswählen
.
.
.
# use QT4
FIND_PACKAGE(Qt4 COMPONENTS QtCore QtGui QtSql REQUIRED)
INCLUDE(${QT_USE_FILE})
INCLUDE_DIRECTORIES(
${QT_INCLUDE_DIR}
)
include(UseQt4)
QT4_WRAP_CPP( MOCFILES ${SOURCEPATH}/mainwindow.h ${SOURCEPATH}/setdatabase.h)
QT4_WRAP_UI( ui_mainwindow ${SOURCEPATH}/mainwindow.ui ${SOURCEPATH}/setdatabase.ui)
SET( SOURCES ${SOURCEPATH}/main.cpp ${SOURCEPATH}/mainwindow.h ${SOURCEPATH}/mainwindow.cpp
${SOURCEPATH}/mysqlhandler.h ${SOURCEPATH}/mysqlhandler.cpp
${SOURCEPATH}/setdatabase.h ${SOURCEPATH}/setdatabase.cpp
${MOCFILES} ui_mainwindow ui_setdatabase)
# build library
ADD_EXECUTABLE(XXX ${SOURCES})
TARGET_LINK_LIBRARIES(XXX ${QT_LIBRARIES})
An der Stelle im Code an der ich dann die Verbindung zur Datenbank herstellen will steht folgendes:
Code: Alles auswählen
#include <QtSql/QSqlDatabase>
#include <QtSql/QMYSQLDriver>
.
.
.
QSqlDatabase db=QSqlDatabase::addDatabase("QMYSQL");
Alle Includes funktionieren einwandfrei, aber die Treiber werden nicht gelinkt. Wenn ich mein Programm starte erhalte ich nämlich die Fehlermeldung:
QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers:
Ich arbeite unter einem UNIX System und unter /usr/share/qt4/plugins/sqldrivers ist u.a. die libqsqlmysql.so aufgeführt. Jetzt habe ich allerdings auch nach Recherchieren nicht rausbekommen wie ich CMAKE sagen kann, dass auch gegen diese Treiber gelinkt werden soll (im QT Kontext).
Kann mir da jemand weiterhelfen?
Grüße und Danke im Voraus
Verfasst: 27. Januar 2011 13:29
von Christian81
Das die SQL-Treiber Plugins sind ist weder das 'include <QtSql/QMYSQLDriver> ' noch irgendwas in CMakeLists.txt diesbezüglich nötig.
Wenn das QMYSQL-Plugin nicht geladen werden kann liegt es entweder daran dass Du es nicht gebaut hast oder das eine Dependency-Dll fehlt (siehe Foren-Suche)!
Verfasst: 27. Januar 2011 18:30
von Mensch
Der Treiber ist gebaut. Da ich unter Linux arbeite wird daraus halt keine .dll, sondern eine .so Datei. Gegen diese Lib wird auch gelinkt, das habe ich mal testweise in CMAKE explizit gesetzt. Dennoch kann der Treiber nicht geladen werden.
Verfasst: 27. Januar 2011 18:52
von Mensch
Update: Wenn ich den sqldrivers Ordner symbolisch aus /usr/share/... in den build Ordner meines Projekts linke klappt es. D.h. ich muss einen Fehler mit CMAKE machen. Allerdings ist das dann glaube ich eher eine Frage für ein CMAKE Forum.
Danke trotzdem und Grüße
Verfasst: 27. Januar 2011 19:14
von Christian81
Na wenn Du meinst... man muss nicht gegen ein
Plugin linken sonst wäre es nämlich kein Plugin...

Re: CMAKE und QMYSQLDRIVER
Verfasst: 27. Januar 2011 20:10
von padreigh
Mensch hat geschrieben:Alle Includes funktionieren einwandfrei, aber die Treiber werden nicht gelinkt. Wenn ich mein Programm starte erhalte ich nämlich die Fehlermeldung:
MEEEEEEEEEEEEEEEEEEEEEEEEEP Falsch. Das linken klappt, was nicht klappt ist das auffinden der lib beim start des executables. Kennst du "ldd" .. mach mal "ldd progname" dann siehst du genau WELCHE libs eingebunden werden. Der mysqldriver wird dort als fehlend aufgeführt.
Lösung:
-> symbolisch reinlinken
-> LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:path_to_lib ./progname beim Start
-> oder LD_LIBRARY_PATH (zB in der .bashrc) so einstellen dass er im richtigen Verzeichnis sucht.
Verfasst: 28. Januar 2011 10:55
von Mensch
Hi padreigh,
vielen Dank für die hilfreiche Antwort. Ich habe den LD_LIBRARY_PATH angepasst und alles läuft einwandfrei. Allerdings verrät mir ldd immer noch nicht, dass mein executeable den Treiber jetzt einbindet.
@Christian81 :
Na wenn Du meinst... man muss nicht gegen ein Plugin linken sonst wäre es nämlich kein Plugin... Rolling Eyes
Warum denn nicht? Ich kenne recht viele Systeme, die Plugins als .dll oder eben .so erwarten und entsprechend einbinden. Und somit linke ich gegen die Bibliothek die die Plugins enthält, also auch gegen die Plugins. Oder formuliere ich das falsch?
Grüße
Verfasst: 28. Januar 2011 11:35
von franzf
Mensch hat geschrieben:Warum denn nicht? Ich kenne recht viele Systeme, die Plugins als .dll oder eben .so erwarten und entsprechend einbinden. Und somit linke ich gegen die Bibliothek die die Plugins enthält, also auch gegen die Plugins. Oder formuliere ich das falsch?
Du verstehst da etwas falsch. Ein Plugin ist normalerweise eine dll. Mit 2 gravierenden Unterschieden in der Verwendung:
* Das Plugin wird nicht zum Executable gelinkt während dem Build-Prozess. Vielmehr geschieht dies während der Laufzeit. Üblicherweise wird das Programm gestartet und schaut ERST DANN, welche Plugins installiert sind und lädt diese, evtl. in Abhängigkeit einer vom User generierten Konfigurationsdatei
* Das Interface des Plugins wird nicht durch einen Header angesprochen, du muss dir mit definierten Funktionen die Symbole selber aus der dll ziehen. Hinzu kommt, dass das Interface auf C-Funktionen beschränkt ist, da die darunterliegenden Funktionen C-Funktionen sind (dlopen, dlsym, usw)
Der erste Punkt führt dazu, dass ldd dein Plugin nicht anzeigt - es handelt sich bei dem Plugin um keine fix dazugelinkte dll.
Verfasst: 28. Januar 2011 11:40
von padreigh
du linkst gegen (vermutlich) gegen /usr/lib/libQtSql.so, das ist der Datenbank"Wrapper" von Qt. Wenn du dort eine Datenbank "createst" musst du die entsprechende "Art" des Treibers angeben
http://cartan.cas.suffolk.edu/qtdocs/qs ... Database-2 das ist ne statische Methode die hinter den Scenen das entsprechende Plugin zum laden nutzt - wenn es das nicht findet, PENG.
http://cartan.cas.suffolk.edu/qtdocs/qsqldatabase.html#addDatabase-2 hat geschrieben:
QSqlDatabase QSqlDatabase::addDatabase ( QSqlDriver * driver, const QString & connectionName = QLatin1String( defaultConnection ) ) [static]
[SNIPP VIEL TEXT DEN DU MAL LESEN SOLLTEST]
Remember that you must link your application against the database client library.
Make sure the client library is in your linker's search path, ...
[SNIPP NOCH MEHR TEXT DEN DU MAL LESEN SOLLTEST]
Verfasst: 28. Januar 2011 14:01
von Mensch
Alles klar. Danke für die vielen Hinweise und Hilfen!