Seite 1 von 2

[gelöst] MySql - LibraryPath

Verfasst: 12. März 2006 22:43
von Marco812
Hallo,

wenn ich eine Anwendung als static Kompilliere und versuche mit dieser von einem anderen PC auf eine MySql Datenbank anzusprechen, erhalte ich die Fehlermeldung „driver not load“

Der Treiber befindet sich doch schon fertig unter: QTDIR\plugins\sqldriversqsqlmysql.dll

QDir* dir=new QDir();
dir->convertToAbs();
app.addLibraryPath(dir->currentDirPath() );

und so gebe ich den Treiberpfad an. Auch wenn ich den Treiber neu erstelle, ändert sich nichts:

cd %QTDIR%\src\plugins\sqldrivers\mysql
qmake -o Makefile "INCLUDEPATH+=C:\MYSQL\INCLUDE" "LIBS+=C:\MYSQL\LIB\OPT\LIBMYSQL.LIB" mysql.pro
nmake

auf dem Entwicklungsrechner funktioniert alles ohne Probleme. Welche *.dll’s und Dateien benötige ich und wie muss ich den Plugin Pfad angeben?

Gruß

Marco

P.S.
Der Treiber befindet sich natürlich im Programmverzeichnis, in dem auch meine *.exe ist.

Verfasst: 13. März 2006 10:56
von BartSimpson
beim statischen linken gehen keine Plug-ins!!!
Siehe Doku. Da muste du denn die lib mit dem Parameter -qt-sql-mysql übersetzen.

Verfasst: 13. März 2006 14:05
von Marco812
Hallo,

ok ich habe jetzt folgendes gemacht, configure -qt-sql-mysql und wo bekomme ich jetzt die passende libmySQL.dll her, genau das gleiche problem habe ich dann auch mit SQLite sqlite3.dll. Muss ich sonst noch etwas beachten?

Gruß

Marco

Verfasst: 13. März 2006 14:38
von BartSimpson
du braucht keine DLL mehr.
Da du denn gegen mysqlclient.lib und nicht libmysql.lib linken must.
Mit SQL Lite ist das kein Problem, da dies eh statisch gelinkt wird.
Nur must du denn sagen -qt-sql-sqlite

Verfasst: 14. März 2006 03:45
von Marco812
Hallo,

ich habe jetzt das QT so konfigurieren wollen: configure -qt-sql-mysql -I C:\mysql\include -L C:\mysql\lib\opt -qt-sql-sqlite -static -release –fast

Nun erhalte ich folgende Fehler:

QtSql.lib(qsql_mysql.obj) : error LNK2019: Nicht aufgelöstes externes Symbol '_m
ysql_fetch_row@4', verwiesen in Funktion '"protected: virtual bool __thiscall QM
YSQLResult::fetchNext(void)" (?fetchNext@QMYSQLResult@@MAE_NXZ)'
QtSql.lib(qsql_mysql.obj) : error LNK2019: Nicht aufgelöstes externes Symbol '_m
ysql_stmt_fetch@4', verwiesen in Funktion '"protected: virtual bool __thiscall Q
MYSQLResult::fetchNext(void)" (?fetchNext@QMYSQLResult@@MAE_NXZ)'

//…gekürzt!!!

ysql_list_tables@8', verwiesen in Funktion '"public: virtual class QStringList _
_thiscall QMYSQLDriver::tables(enum QSql::TableType)const " (?tables@QMYSQLDrive
r@@UBE?AVQStringList@@W4TableType@QSql@@@Z)'
release\books.exe : fatal error LNK1120: 45 unaufgelöste externe Verweise
NMAKE : fatal error U1077: 'link': R³ckgabe-Code '0x460'
Stop.
NMAKE : fatal error U1077: '"C:\Programme\Microsoft Visual Studio .NET 2003\VC7\
BIN\nmake.exe"': R³ckgabe-Code '0x2'
Stop.

Warum erhalte ich diese Fehler und was kann ich dagegen machen?

Vorab noch eine weitere frage sollte QT dann so konfiguriert sein, kann ich einfach MySQL und SQLite nutzen, oder muss ich in meiner *.pro noch mysqlclient.lib hinzufügen? Für SQLite muss ich doch nur den aktuellen Source in das Verzeichnis QTDIR\src\3rdparty\sqlite stellen und QT konfigurieren oder?

Gruß

Marco812

Verfasst: 14. März 2006 09:34
von BartSimpson
Ja du kannst denn beides nutzen. Der Fehler kommt daher, dann es ein Symbol in deiner MySQL Bibliothek nicht findet. Da deine config Zeile falsch ist.
So sollte es heissen:
configure -qt-sql-mysql -I C:\mysql\include -L C:\mysql\lib\opt -lmysqlclient -qt-sql-sqlite -static -release –fast

Verfasst: 14. März 2006 11:22
von Marco812
Hallo,

nun erhalte ich eine neue Fehlermeldung, wie kann ich dieses Problem beheben?

-I"C:/QT/mkspecs/win32-msvc.net" -Fotmp\obj\release_static\ @C:\DOKUME~1\xdfON~
1\LOKALE~1\Temp\nm12A.tmp
moc_bookwindow.cpp
link /LIBPATH:"C:\QT\lib" /LIBPATH:"C:\QT\lib" /NOLOGO /NODEFAULTLIB:"li
bc" /SUBSYSTEM:WINDOWS /OUT:"release\books.exe" @C:\DOKUME~1\xdfON~1\LOKALE~1\T
emp\nm12B.tmp
libcmt.lib(dosmap.obj) : error LNK2005: __errno bereits in MSVCRT.lib(MSVCR71.dl
l) definiert
libcmt.lib(dosmap.obj) : error LNK2005: ___doserrno bereits in MSVCRT.lib(MSVCR7
1.dll) definiert
libcmt.lib(tolower.obj) : error LNK2005: _tolower bereits in MSVCRT.lib(MSVCR71.

//…gekürzt!!!

LINK : warning LNK4098: Standardbibliothek 'MSVCRT' steht in Konflikt mit andere
n Bibliotheken; /NODEFAULT:Bibliothek verwenden
MSVCRT.lib(cinitexe.obj) : warning LNK4098: Standardbibliothek 'libcmt.lib' steh
t in Konflikt mit anderen Bibliotheken; /NODEFAULT:Bibliothek verwenden
release\books.exe : fatal error LNK1169: Ein oder mehrere mehrfach definierte Sy
mbole gefunden
NMAKE : fatal error U1077: 'link': R³ckgabe-Code '0x491'
Stop.

Gruß

Marco812

Verfasst: 14. März 2006 11:53
von BartSimpson
Also Qt haste jetzte erst mal übersetzt:)
wo kommt denn die libcmt.lib her?
Es scheint eine Funktion 2 mal zu geben einmal in dieser Lib und einmal in der Lib von MS.

Verfasst: 14. März 2006 12:13
von Marco812
Hallo,

also ich habe die libcmt.lib einmal in C:\Programme\Microsoft Visual Studio 6\VC98\Lib und einmal in C:\Programme\Microsoft Visual Studio .NET 2003\Vc7\lib

verstehe aber nicht warum das einen Fehler verursacht. Im QT Verzeichnis ist die libcmt.lib nicht zu finden!

Wie würdest du jetzt weiter vorgehen?

Gruß

Marco812

Verfasst: 14. März 2006 12:17
von Christian81
Du versuchst eine statische qt-dll mit einer dynamischen mysql-lib zu linken was nicht gehen kann.
Ich frage mich nur woher dieser blöde static-Hype kommt - bringt keinen Vorteil und macht nur Probleme :roll:

Verfasst: 14. März 2006 12:40
von Marco812
Hallo,
wo bekomme ich dann bitte die statische mysql-lib her?
Gruß
Marco812

Verfasst: 14. März 2006 13:13
von BartSimpson
Die ist automatisch dabei, wenn du bei der MySQL Installation die Developer Tools installieren läßt. Dann hast du 2 Libs. libmysql zum dynamisch und mysqlclient.lib zum statisch linken.

Verfasst: 14. März 2006 14:36
von macman
Christian81 hat geschrieben:Ich frage mich nur woher dieser blöde static-Hype kommt - bringt keinen Vorteil und macht nur Probleme :roll:
Probleme bringen doch wohl ehr DLLs. Da man nie weiß was da ist, muß man immer alles mitliefern, und das ist im Endeffekt deutlich mehr als ein statisch gelinktes Programm. Allein die QtGui4.dll ist fast 4 MB schwer, QtCore braucht man immer, noch ein MB. Das selbe Programm statisch gelinkt ist gerade mal 900K groß.

Aber die Dateigröße ist nicht das Problem. Selbst wenn ich weiß das Qt auf einem Rechner installiert ist, muß ich trotzdem meine DLLs mit liefern, da ich nie sicher gehen kann, das Qt so compiliert wurde wie ich es brauche.

Also, wo ist der Vorteil des dynamischen Linkens, wenn ich dann doch wieder alles mitliefern muß? Nur weil ich Programmteile austauschen kann, ohne das Programm neu compilieren zu müssen?

Qt4 muss dynamisch gelinkt werden, sonst verbaut man sich einiges. Damit habe ich mich abgefunden, der Sinn erschließt sich mir jedoch nicht.

Verfasst: 14. März 2006 16:37
von Marco812
Hallo,

also ich habe mir jetzt noch mal mysql-noinstall-5.0.19-win32.zip herunter geladen und so konfiguriert, configure -qt-sql-mysql -I C:\mysql\include -L C:\mysql\lib\opt -l mysqlclient -qt-sql-sqlite -static -release der gleiche fehler wieder, ich habe nur zwei mal die lib einmal in MYSQLDIR\lib\opt und einmal in MYSQLDIR\lib\debug aber die wird es wohl nicht sein oder?

Gruß

Marco812

Verfasst: 14. März 2006 18:28
von Marco812
Hallo,

es will einfach nicht gelingen, was muss ich denn an configure übergeben, wenn ich die libmysql.dll und sqlite3.dll im release verwenden möchte? Bei mir funktioniert es nur in der Debug version.

Gruß

Marco812