[gelöst] CMAKE und QMYSQLDRIVER

Alles rund um die Programmierung mit Qt
Antworten
Mensch
Beiträge: 50
Registriert: 16. März 2008 19:44

[gelöst] CMAKE und QMYSQLDRIVER

Beitrag 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
Zuletzt geändert von Mensch am 28. Januar 2011 14:04, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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)!
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Mensch
Beiträge: 50
Registriert: 16. März 2008 19:44

Beitrag 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.
Mensch
Beiträge: 50
Registriert: 16. März 2008 19:44

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Na wenn Du meinst... man muss nicht gegen ein Plugin linken sonst wäre es nämlich kein Plugin... :roll:
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Re: CMAKE und QMYSQLDRIVER

Beitrag 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.
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
Mensch
Beiträge: 50
Registriert: 16. März 2008 19:44

Beitrag 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
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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.
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag 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]
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
Mensch
Beiträge: 50
Registriert: 16. März 2008 19:44

Beitrag von Mensch »

Alles klar. Danke für die vielen Hinweise und Hilfen!
Antworten