Seite 1 von 1
MySQL und QT statisch kompilieren
Verfasst: 25. Juli 2009 18:39
von Phorx
Hallo,
ich habe ein kleines Programm geschrieben in dem ich MySQL nutze. Nach einiger Zeit hatte ich QT dann auch so kompiliert dass mein Programm kompiliert wurde.
Allerdings wollte ich das ganze jetzt auch statisch kompilieren, dass ich es auch auf anderen Rechnern laufen lassen kann.
Problem: Bekomme lauter "Verweis auf nicht aufgelöstes externes Symbol"-Fehler. Hab auch schon versucht was in der Dokumentation zu "Plugins in statischen Programmen nutzen" steht - allerdings ohne all zu großen Erfolg. Danach bekam ich 100 Fehler mehr vom nmake

... die mir alle sagen, dass sie die ganzen MySQL Funktionen und Klassen nicht kennen.
Kann mir vielleicht jemand kurz und funktionierend sagen wie ich QT + MySQL statisch bekomm und danach mein Projekt kompilieren muss?
(QT "in normal" hab ich schon statisch kompiliert und auch statische Projekte kompiliert, die sogar auf anderen Rechnern liefen

- Problem besteht also darin MySQL dazu zu bekommen)
Vielen Dank schonmal an alle die versuchen zu helfen

.
MfG Phillip
Verfasst: 28. Juli 2009 12:24
von Phorx
Ich hab das ganze nochmal mit MingW (anstatt Visual Studio) versucht, weil es dazu ja bereits eine Anleitung gibt. Hat soweit auch gut geklappt, beim kompilieren bekomm ich jedoch sehr ähnliche Fehler wie vorher mit Visual Studio ...
Code: Alles auswählen
release/primecom.o:primecom.cpp:(.text+0x784): undefined reference to `QSqlDatab
ase::defaultConnection'
release/primecom.o:primecom.cpp:(.text+0x7ba): undefined reference to `QSqlDatab
ase::addDatabase(QString const&, QString const&)'
release/primecom.o:primecom.cpp:(.text+0x812): undefined reference to `QSqlDatab
ase::setHostName(QString const&)'
release/primecom.o:primecom.cpp:(.text+0x850): undefined reference to `QSqlDatab
ase::setDatabaseName(QString const&)'
release/primecom.o:primecom.cpp:(.text+0x88e): undefined reference to `QSqlDatab
ase::setUserName(QString const&)'
release/primecom.o:primecom.cpp:(.text+0x8cc): undefined reference to `QSqlDatab
ase::setPassword(QString const&)'
release/primecom.o:primecom.cpp:(.text+0x8ee): undefined reference to `QSqlDatab
ase::open()'
release/primecom.o:primecom.cpp:(.text+0x8f9): undefined reference to `QSqlDatab
ase::isOpen() const'
release/primecom.o:primecom.cpp:(.text+0x90f): undefined reference to `QSqlDatab
ase::QSqlDatabase()'
release/primecom.o:primecom.cpp:(.text+0x93d): undefined reference to `QSqlQuery
::QSqlQuery(QString const&, QSqlDatabase)'
release/primecom.o:primecom.cpp:(.text+0x95c): undefined reference to `QSqlDatab
ase::~QSqlDatabase()'
release/primecom.o:primecom.cpp:(.text+0x96a): undefined reference to `QSqlQuery
::isActive() const'
release/primecom.o:primecom.cpp:(.text+0xa05): undefined reference to `QSqlDatab
ase::close()'
release/primecom.o:primecom.cpp:(.text+0xa13): undefined reference to `QSqlQuery
::~QSqlQuery()'
release/primecom.o:primecom.cpp:(.text+0xa1e): undefined reference to `QSqlDatab
ase::~QSqlDatabase()'
release/primecom.o:primecom.cpp:(.text+0xac4): undefined reference to `QSqlDatab
ase::close()'
release/primecom.o:primecom.cpp:(.text+0xb59): undefined reference to `QSqlQuery
::record() const'
release/primecom.o:primecom.cpp:(.text+0xb68): undefined reference to `QSqlRecor
d::indexOf(QString const&) const'
release/primecom.o:primecom.cpp:(.text+0xb70): undefined reference to `QSqlRecor
d::~QSqlRecord()'
release/primecom.o:primecom.cpp:(.text+0xbb1): undefined reference to `QSqlQuery
::record() const'
release/primecom.o:primecom.cpp:(.text+0xbc0): undefined reference to `QSqlRecor
d::indexOf(QString const&) const'
release/primecom.o:primecom.cpp:(.text+0xbce): undefined reference to `QSqlRecor
d::~QSqlRecord()'
release/primecom.o:primecom.cpp:(.text+0xc17): undefined reference to `QSqlQuery
::next()'
release/primecom.o:primecom.cpp:(.text+0xc37): undefined reference to `QSqlQuery
::value(int) const'
release/primecom.o:primecom.cpp:(.text+0xc80): undefined reference to `QSqlDatab
ase::close()'
release/primecom.o:primecom.cpp:(.text+0xe9c): undefined reference to `QSqlDatab
ase::defaultConnection'
release/primecom.o:primecom.cpp:(.text+0xed8): undefined reference to `QSqlDatab
ase::addDatabase(QString const&, QString const&)'
release/primecom.o:primecom.cpp:(.text+0xf39): undefined reference to `QSqlDatab
ase::setHostName(QString const&)'
release/primecom.o:primecom.cpp:(.text+0xf80): undefined reference to `QSqlDatab
ase::setDatabaseName(QString const&)'
release/primecom.o:primecom.cpp:(.text+0xfc7): undefined reference to `QSqlDatab
ase::setUserName(QString const&)'
release/primecom.o:primecom.cpp:(.text+0x100e): undefined reference to `QSqlData
base::setPassword(QString const&)'
release/primecom.o:primecom.cpp:(.text+0x1036): undefined reference to `QSqlData
base::open()'
release/primecom.o:primecom.cpp:(.text+0x1044): undefined reference to `QSqlData
base::isOpen() const'
release/primecom.o:primecom.cpp:(.text+0x10e8): undefined reference to `QSqlData
base::close()'
release/primecom.o:primecom.cpp:(.text+0x10f6): undefined reference to `QSqlData
base::~QSqlDatabase()'
release/primecom.o:primecom.cpp:(.text+0x1401): undefined reference to `QSqlData
base::QSqlDatabase()'
release/primecom.o:primecom.cpp:(.text+0x1417): undefined reference to `QSqlQuer
y::QSqlQuery(QString const&, QSqlDatabase)'
release/primecom.o:primecom.cpp:(.text+0x141f): undefined reference to `QSqlData
base::~QSqlDatabase()'
release/primecom.o:primecom.cpp:(.text+0x142d): undefined reference to `QSqlQuer
y::isActive() const'
release/primecom.o:primecom.cpp:(.text+0x14d7): undefined reference to `QSqlData
base::close()'
release/primecom.o:primecom.cpp:(.text+0x1518): undefined reference to `QSqlData
base::close()'
release/primecom.o:primecom.cpp:(.text+0x1534): undefined reference to `QSqlQuer
y::~QSqlQuery()'
release/primecom.o:primecom.cpp:(.text+0x155c): undefined reference to `QSqlData
base::~QSqlDatabase()'
release/primecom.o:primecom.cpp:(.text+0x179c): undefined reference to `QSqlData
base::defaultConnection'
release/primecom.o:primecom.cpp:(.text+0x17d5): undefined reference to `QSqlData
base::addDatabase(QString const&, QString const&)'
release/primecom.o:primecom.cpp:(.text+0x1830): undefined reference to `QSqlData
base::setHostName(QString const&)'
release/primecom.o:primecom.cpp:(.text+0x1871): undefined reference to `QSqlData
base::setDatabaseName(QString const&)'
release/primecom.o:primecom.cpp:(.text+0x18b2): undefined reference to `QSqlData
base::setUserName(QString const&)'
release/primecom.o:primecom.cpp:(.text+0x18f3): undefined reference to `QSqlData
base::setPassword(QString const&)'
release/primecom.o:primecom.cpp:(.text+0x1915): undefined reference to `QSqlData
base::open()'
release/primecom.o:primecom.cpp:(.text+0x1920): undefined reference to `QSqlData
base::isOpen() const'
release/primecom.o:primecom.cpp:(.text+0x1960): undefined reference to `QSqlData
base::lastError() const'
release/primecom.o:primecom.cpp:(.text+0x1975): undefined reference to `QSqlErro
r::text() const'
release/primecom.o:primecom.cpp:(.text+0x1a75): undefined reference to `QSqlErro
r::~QSqlError()'
release/primecom.o:primecom.cpp:(.text+0x1a80): undefined reference to `QSqlData
base::close()'
release/primecom.o:primecom.cpp:(.text+0x1a8b): undefined reference to `QSqlData
base::~QSqlDatabase()'
release/primecom.o:primecom.cpp:(.text+0x1bd5): undefined reference to `QSqlData
base::QSqlDatabase()'
release/primecom.o:primecom.cpp:(.text+0x1beb): undefined reference to `QSqlQuer
y::QSqlQuery(QString const&, QSqlDatabase)'
release/primecom.o:primecom.cpp:(.text+0x1bf3): undefined reference to `QSqlData
base::~QSqlDatabase()'
release/primecom.o:primecom.cpp:(.text+0x1bfb): undefined reference to `QSqlQuer
y::isActive() const'
release/primecom.o:primecom.cpp:(.text+0x1d79): undefined reference to `QSqlQuer
y::record() const'
release/primecom.o:primecom.cpp:(.text+0x1d88): undefined reference to `QSqlReco
rd::indexOf(QString const&) const'
release/primecom.o:primecom.cpp:(.text+0x1d90): undefined reference to `QSqlReco
rd::~QSqlRecord()'
release/primecom.o:primecom.cpp:(.text+0x1dd1): undefined reference to `QSqlQuer
y::record() const'
release/primecom.o:primecom.cpp:(.text+0x1de0): undefined reference to `QSqlReco
rd::indexOf(QString const&) const'
release/primecom.o:primecom.cpp:(.text+0x1de8): undefined reference to `QSqlReco
rd::~QSqlRecord()'
release/primecom.o:primecom.cpp:(.text+0x1e29): undefined reference to `QSqlQuer
y::record() const'
release/primecom.o:primecom.cpp:(.text+0x1e38): undefined reference to `QSqlReco
rd::indexOf(QString const&) const'
release/primecom.o:primecom.cpp:(.text+0x1e46): undefined reference to `QSqlReco
rd::~QSqlRecord()'
release/primecom.o:primecom.cpp:(.text+0x1e68): undefined reference to `QSqlQuer
y::next()'
release/primecom.o:primecom.cpp:(.text+0x1e8e): undefined reference to `QSqlQuer
y::value(int) const'
release/primecom.o:primecom.cpp:(.text+0x1f87): undefined reference to `QSqlData
base::close()'
release/primecom.o:primecom.cpp:(.text+0x1f8f): undefined reference to `QSqlQuer
y::~QSqlQuery()'
collect2: ld returned 1 exit status
Wäre super wenn mir jemand helfen könnte

Verfasst: 28. Juli 2009 12:36
von AuE
Statisches kompilieren ist AFAIK nicht LGPL EDIT:remove GPL EDIT konform oder?
Das heisst du bräuchtest dann eine kommerzielle Version. Was spricht denn gegen dynamische?
Die unaufgelösten externen Verweise bedeuten das er die Files in denen sich die Funktionen befinden nicht finden kann. Also entweder du hast die nicht in deinem Pfad oder die Dateien sind nicht existent. Check das doch mal!
Tritt dieser Fehler auf wenn du das Plugin kompilierst oder wenn du deine App kompilierst?
Zum Thema MySql mal die Forensuche benutzen-da gibts immer mal wieder nen Thread zu!
Ansonsten wären mehr Infos hilfreich!
Verfasst: 28. Juli 2009 12:39
von franzf
Das sollte helfen:
http://doc.qtsoftware.com/4.5/plugins-h ... ic-plugins
// edit
Und sicher ist statisch linken GPL-konform, wenn auch der Sourcecode zur Verfügung steht (eben GPL). Wenn man aber Qt als LGPL verwendet, und eben seinen Sourcecode nicht rausrückt, ist statisch linken untersagt.
Verfasst: 28. Juli 2009 12:44
von AuE
Wenn man aber Qt als LGPL verwendet, und eben seinen Sourcecode nicht rausrückt, ist statisch linken untersagt.
Sicher?
Soweit ich LGPL verstanden habe muss man bei der LGPL den Code nicht mehr offen legen. Man muss aber jedem erlauben die benutzten Quellen (in dem Fall die Qt Libs) auszutauschen.... Oder hab ich da was flasch in erinnerung?
Mit GPL hast recht-mein Fehler!
Verfasst: 28. Juli 2009 14:42
von Phorx
Franz das hab ich bereits versucht - nur mit Visual Studio. Da kamen aber die gleichen Fehler... die .h-dateien ( welche zuvor vom Compiler gefordert werden ) sind im gleichen verzeichnis wie das projekt.
Das Projekt habe ich bereits im Visual Studio kompiliert. Klappt alles. Aber ich bekomms auf anderen Rechnern (ohne QT) nicht zum Laufen, hab bereits versucht die ganzen dlls (die Dependency Walker mir nennt) dazu zu legen aber brachte auch nichts.
Langsam verzweifel ich an MySQL + QT
edit: Was für Informationen wären denn ansonsten noch nützlich?
MfG Phillip
Verfasst: 28. Juli 2009 14:46
von Mani99
Warum verwenden alle unter windows diesen microsoft krempel?
QtCreator + QT + MinGW und alles funktioniert bestens, ich hätte noch nie probleme gehabt das etwas nicht funktioniert.
Außerdem wüsste ich nicht was die microsoft ide mehr/brauchbareres kann als der qtcreator?
Verfasst: 28. Juli 2009 15:05
von Phorx
was das besseres kann weiss ich auch nicht
Ich hab ja mittlerweile auch Mingw versucht. Aber klappt genauso wenig wie mit dem "Microsost Krempel"... mich würde es sehr freuen wenn ich egal mit welchem Compiler/IDE ein MySQL+QT - Programm auf anderen Rechnern ausführen könnte. Wie und womit ist mir egal, hauptsache es klappt...
Verfasst: 28. Juli 2009 15:05
von AuE
Man kann in der IDE die einzelnen Fenster verschieben ohne das man neu kompilieren muss
Aber im Prinzip hast du da recht! Auch wenn einige Sacehn im Creator noch recht schwer zu finden sind-aber für den hausgebrauch ist er super-und auch auf Arbeit kann man einiges mit anfangen!
Verfasst: 28. Juli 2009 21:45
von Phorx
Hmm ok. Bin jetzt soweit gekommen, das ich die Anwendung auf anderen Rechnern starten kann.
Jetzt hab ich das Problem das ich keine MySql-Verbindung hin bekommen. Weil der MySQLDriver nicht gefunden wird. Auf meinem Rechner klappt es allerdings.
Wo muss ich jetzt welche Dateien hinkopieren damit der fremde Rechner weiss wo er den MySQL-Treiber findet?
( einfach nur die QMySQLDriver in das Anwendungsverzeichnis hat leider nicht funktioniert )
Verfasst: 29. Juli 2009 06:32
von Christian81
Wenn franfz schon einen Link gepostet hat sollte man ihn ggf. auch lesen:
http://doc.trolltech.com/4.5/plugins-ho ... extensions
Verfasst: 29. Juli 2009 14:59
von Phorx
Da finde ich nichts was meine Frage beantwortet.
Dort wird ja nur gesagt das man Plugins selbst schreiben kann (was ich nicht möchte) und das man statische Plugins erstellen kann... möchte ich allerdings nur wenn es nicht anders geht. Da in der Dokumentation ja kein anderer Weg genannt wird geh ich davon aus dass man den MySQL-Treiber nicht durch das mitgeben von irgendwelchen Librarys auf anderen Sytemen laden kann, sondern ausschließlich durch das erstellen von Plugins!?
Verfasst: 30. Juli 2009 16:19
von Phorx
An alle die das gleiche Problem haben:
Wenn man alle benötigten dlls und die kompilierte exe auf den fremden Rechner kopiert hat, muss man noch einen Unterordner 'sqldrivers' im verzeichnis anlegen, wo die exe liegt. Dort kopiert man den Inhalt aus %QTDIR%/plugins/sqldrivers rein. Fertig.
MfG Phillip