2010-08-16 6 views
1

J'essaye de faire un programme qt sur Windows 7 qui utilise un plugin MySQL.Win7 MInGW QT programme MySQL cris "ne peut pas trouver -lqsqlmysqld"; où est la bibliothèque manquante?

J'ai compilé à la fois qt et le plugin mysql sans problème en utilisant mon compilateur minGW 32 bits.

Cependant, je continue à obtenir une erreur comme ceci:

mingw32-make -f Makefile.Debug 
mingw32-make[1]: Entering directory `C:/Users/dhatt/Desktop/testdb2' 
g++ -c -g -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_SQL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -DQT_NEEDS_QMAIN - I"..\..\..\..\QT\qt\include\QtCore" -I"..\..\..\..\QT\qt\include\QtGui" -I"..\..\..\..\QT\qt\include\QtSql" -I"..\..\..\..\QT\qt\include" -I"..\..\..\..\MySQL\bin" -I"..\..\..\..\QT\qt\include\ActiveQt" -I"debug" -I"..\..\..\..\QT\qt\mkspecs\win32-g++" -o debug\database.o database.cpp 
g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -mthreads -Wl -Wl,-subsystem,windows -o debug\testdb2.exe debug/database.o -L"c:\QT\qt\lib" -lmingw32 -lqtmaind -L C:\MySQL\lib\opt -LC:/QT/qt/plugins/sqldrivers -lqsqlmysqld -lQtSqld4 -lQtGuid4 -lQtCored4 -LC:\MySQL\lib\opt 
C:/qt/mingw/bin/../lib/gcc/mingw32/4.4.0/../../../../mingw32/bin/ld.exe: cannot find -lqsqlmysqld 
collect2: ld returned 1 exit status 
mingw32-make[1]: *** [debug\executable.exe] Error 1 
mingw32-make[1]: Leaving directory `C:/Users/dhatt/Desktop/testdb2' 
mingw32-make: *** [debug] Error 2 

je présenter des excuses à l'avance pour être très bavard de ce que je faisais, mais je fais cela en partie pour le dépannage, et en partie pour tout autre perdu les âmes ne finissent pas par perdre trois semaines sur ce problème particulier. :)

Voici mes spécifications:

Windows 7 Nokia's Open Source QT 
Qt SDK for Windows (C:\Qt\2010.04\qt) 
Linux MinGW Version 5.1.6 (C\Linux\MinGW) 
MySQL5 with C++ files (C:\MySQL5) 

Si vous voulez savoir comment j'ai installé qt, il suffit de suivre les instructions de ce site:

http://www.jiggerjuice.net/software/qt-sql-drivers.html

Ces autres sites peuvent contenir des fonctionnalités supplémentaires information tidbits:

http://doc.qt.nokia.com/4.6/sql-driver.html

http://www.rag.com.au/linux/qt4howto.html

http://qtnode.net/wiki?title=Qt4_on_Windows (oui, j'ai vérifié avec les documents de Nokia !!!)

http://doc.trolltech.com/qq/qq10-windows-deployment.html

Cet homme mentionné au sujet refaisant qmake, que je ne fais pas à moins d'avoir une bonne raison.

http://christopher.rasch-olsen.no/2009/04/14/qt-45-and-mysql-plugin-with-mingw-on-windows-xp/

je l'ai déjà supprimé le cache du plug-in une fois, je l'espère, je n'aurai pas à le faire à nouveau ...

http://doc.trolltech.com/4.2/plugins-howto.html#the-plugin-cache

http://ubuntuforums.org/showthread.php?t=1070155

Si C'est une confusion, entre les deux options de compilation (créer les bibliothèques mysql statiquement, ou en plugin), j'ai choisi pour le plugin car il compile plus vite et je n'ai pas à me soucier de la licence.

Généralement, le gros problème de mysql pour la plupart des gens est de faire une bibliothèque compatible mingw. Généralement, je l'ai fait avec les outils de mingw dans (https://olex.openlogic.com/packages/mingw-utils) ...

c:\> cd MySQL\lib\opt 
c:\mysql\lib\opt> reimp -d libmysql.lib 
c:\mysql\lib\opt> dlltool --input-def libmysql.def --dllname libmysql.dll --output-lib libmysql.a -k 

Je l'ai fait droit puisque dans mon C: \ MySQL \ lib \ opt, il a les deux fichiers:

libmysql.a 
libmysql.lib 
LIBMYSQL.def (not a typo) 

et dans le répertoire C: \ MySQL \ bin, je ai:

libmySQL.bin (not a typo) 

j'avais compilé le plugin mysql préalable:

cd %QTDIR%\src\plugins\sqldrivers\mysql 
qmake "INCLUDEPATH+=C:\MySQL\include" "LIBS+=C:\MYSQL\lib\opt\libmysql.lib" mysql.pro 
mingw32-make 

En conséquence, j'ai dans mon C: \ QT \ qt \ plugins \ sqldrivers dossier:

libqsqlmysql4.a 
libqsqlmysqldq4.a 
libqsqlodbc4.a 
libqsqlodbcd4.a 
qsqlmysql4.dll 
qsqlmysqld4.dll 
qsqlodbc4.dll 
qsqlodbc4.dll 

Et dans mon C: \ QT \ bin

QtSql4.dll 
QtSqld4.dll 

Donc, je suppose de ce site (http://www.qtforum.org/article/21352/how-to-compile-use-a-mysql-driver.html) que j'ai bien compris.

Je n'ai pas utilisé les binaires de qt lui-même, j'ai utilisé les fichiers qt compilés (également de Nokia), mais les ai reconfigurés et recompilés en utilisant mingw32-make. Je n'ai eu aucune erreur. C'était mes options de configuration pour refaire qt.

-opensource 
-nomake examples 
-nomake demos 
-no-sql-lite 
-no-qt3support 
-no-gif 
-no-libpng 
-no-libmng 
-no-libtiff 
-no-phonon 
-no-phonon-backend 
-no-multimedia 
-no-audio-backend 
-no-webkit 
-no-script 
-no-scripttools 
-nodeclarative 
-plugin-sql-mysql -l mysql -I C:\QT\qt\include -L C:\QT\qt\lib\opt 

Voici mon fichier .pro

LANGUAGE = C++ 

TEMPLATE = app 
TARGET = executable 
QT += core sql 
QTPLUGIN += qsqlmysql 
DEPENDPATH += . 
INCLUDEPATH += C:\MySQL\bin 
LIBS += -L C:\MySQL\lib\opt -lmysql 

# Input 
SOURCES += database.cpp 

J'ai installé le plugin décrit ici:

C:\QT\qt 

Mes variables de chemin sont:

%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\QuickTime\QTSystem\;C:\Python26;C:\Linux\Cygwin\bin;C:\mingw-utils-0.3\bin;C:\QT\qt\bin;C:\MySQL\bin;C:\MySQL\include;C:\QT\mingw32\bin;C:\QT\mingw\bin;C:\QT\qt\plugins\sqldrivers 

La commande qt invite ajouté un peu plus, si je l'ai fait tout cela dans l'invite de commande.

Setting up a MinGW/Qt only environment... 
-- QTDIR set to C:\QT\qt 
-- PATH set to C:\QT\qt\bin 
-- Adding C:\QT\bin to PATH 
-- Adding C:\Windows\System32 to PATH 
-- QMAKESPEC set to win32-g++ (mingw is my only compiler so, this is unnecessary) 

Bien que je l'aie déjà fait ou que ce soit redondant. Je n'ajoute cela que pour l'exhaustivité.

Voici mon code (database.cpp):

#include <QtSql> 
#include <iostream> 
using namespace std; 

int main(int argc, char ** argv) 
{ 
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); 
    db.setHostName("---.---.---.---"); 
    db.setDatabaseName("--------"); 
    db.setUserName("------------"); 
    db.setPassword("------------"); 
    if (!db.open()) cout << "Failed to connect to mysql" << endl; 
    else cout << "Works finally." << endl; 
    QSqlDatabase::removeDatabase("QMYSQL"); 
    exit (0); 
} 

Très simple, oui?

Je suis allé à mon répertoire avec le code exemple, exécutez

mingw32-make distclean 
qmake 
mingw32-make 

et obtenez le message d'erreur ci-dessus. J'ai essayé de construire une version avec la version de version seulement (pas de débogage), et il montre toujours le même message, mais avec "ne peut pas trouver -lqsqlmysq", ainsi ce n'est pas cela.

J'ai essayé beaucoup de choses, mais où devrais-je regarder à côté pour le résoudre; peut-être que quelqu'un peut l'affiner pour moi, me mettre sur le bon chemin, ou mieux encore, résoudre son problème ennuyeux.

Aussi, je prévois d'utiliser des liaisons python avec mon code (j'ai besoin de PyQT + MySQL). Si la solution proposée m'empêche de le faire, faites le moi savoir.

Répondre

2

Eh bien, je vais résoudre mon propre problème, encore une fois, alors amusons-nous!

Ceci est votre dernière chance.

Après cela, il n'y a pas de retour en arrière.

Vous téléchargez le PyQT.exe, l'histoire se termine. Vous vous réveillez dans votre lit et vous croyez tout ce que vous voulez croire. Vous modifiez le fichier .pro, vous restez au pays des merveilles. Et, je vous montre à quelle profondeur le trou du lapin va. J'ai finalement abandonné et téléchargé le .exe, qui a le support de MySQL prêt à l'emploi. Si MySQL ne fonctionne pas, votre application est le problème, et je vous recommande de lire cet article ici (http://lists.trolltech.com/qt-interest/2006-06/thread00292-0.html) ou suivez la citation ci-dessous:

Le problème est que vous devez soit utiliser la méthode addLibraryPath ou
créer une instance QCoreApplication avant votre premier appel à charger une base de données

Croyez-moi, l'installation manuelle PyQT + MySQL sur Windows est une douleur. Mais si vous avez besoin d'un plugin hors du chemin pour savoir que l'exécutable ne sait pas, vous devez aller plus loin dans le trou du lapin.

Voici le nouveau fichier .pro et amélioré:

LANGUAGE = C++ 

TEMPLATE = app 
TARGET = executable 
QT += core sql 
QTPLUGIN += qsqlmysql 
DEPENDPATH += . 
INCLUDEPATH += C:\MySQL\bin 
LIBS += -L C:\MySQL\lib\opt 

# Input 
SOURCES += database.cpp 

se trouve que j'ai eu le droit chemin à mysql, je confondant juste avec le fichier .pro que j'avais. Après avoir téléchargé qt et suivi de nouveau les étapes ci-dessus, la modification de mon fichier .pro a fait toute la différence. Mais maintenant, je devais télécharger SIP et PyQT. J'ai suivi les docs là-bas. Il y a quelques problèmes supplémentaires. Suivez les liens ou les directions qui sont laissés là au cas où l'information est supprimée.

Si votre marque SIP installation a une erreur où il se penche sur les chemins Unix (/ usr/bin) au lieu des chemins DOS (C: \ QT), regardez ce lien http://old.nabble.com/Building-SIP-on-MinGW-:-problem-at-%22make-install%22-td28909249.html# (version courte: le problème est le sh.exe dans l'un de vos autres compilateurs linux comme cygwin ou msys, changez le nom temporairement pour forcer make install à utiliser le nommage de chemin DOS):

Si vous configurez PyQT et qu'il recrée une erreur de fichier à faire avec QTCore

Google pexports et télécharger. Accédez à% QTdir%/bin. Suivez ensuite les instructions ou un lien (http://jeethurao.com/blog/?p=18)

pexports QtCore4.dll > QtCore4.def 
dlltool –dllname QtCore4.dll –def QtCore4.def –output-lib libQtCore4.a 
move libQtCore4.a ..\lib 

Et maintenant vous savez kung-fu.

P.S: Je n'ai jamais essayé cette méthode moi-même. C'est une méthode différente, mais non testée (par moi) de compiler PyQT, faite par les trolls chez Trolltech: http://www.diotavelli.net/PyQtWiki/InstallingPyQTCommercialWin