La méthode générale pour installer le plug-in QMYSQL est de recompiler entièrement Qt ; or, il existe une technique moins lourde.
Compilation de QMYSQL sous Windows avec MinGW
La méthode générale pour installer le plug-in QMYSQL est de recompiler entièrement Qt ; or, il existe une technique moins lourde.
Compilation de QMYSQL sous Windows avec MinGW
Avec les versions de gcc > 4, il n'est plus nécessaire d'utiliser dlltool et reimp.
Il suffit d'utiliser la bibliothèque d'importation, libmysql.lib fournie dans les binaires de mysql, donc en utilisant "-llibmysql" au lieu de "-lmysql" dans l'appel à qmake.
Bonjour,
j'ai suivi la procédure indiquée sur ce site qui me produit bien deux .a et deux .dll que j'ai pris soin de copier dans le dossier sqldrivers de Qt (l'installation ne les copie pas).
Mais quand je lance mon application, celle-ci n'arrive pas à charger le driver MySQL
J'ai activé le débug pour les plugins avec QT_DEBUG_PLUGINS et Qt indique que ces plugins ne sont pas valides*:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 QSqlDatabase: QMYSQL driver not loaded QSqlDatabase: available drivers: QSQLITE QODBC3 QODBC
Savez-vous s'il s'agit d'un problème de compilation du driver ou d'installation*?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 QFactoryLoader::QFactoryLoader() looking at "C:/QtSDK/Desktop/Qt/4.8.0/mingw/plugins/sqldrivers/libqsqlmysql4.a" "The file 'C:/QtSDK/Desktop/Qt/4.8.0/mingw/plugins/sqldrivers/libqsqlmysql4.a' is not a valid Qt plugin." not a plugin QFactoryLoader::QFactoryLoader() looking at "C:/QtSDK/Desktop/Qt/4.8.0/mingw/plugins/sqldrivers/libqsqlmysqld4.a" "The file 'C:/QtSDK/Desktop/Qt/4.8.0/mingw/plugins/sqldrivers/libqsqlmysqld4.a' is not a valid Qt plugin." not a plugin QFactoryLoader::QFactoryLoader() looking at "C:/QtSDK/Desktop/Qt/4.8.0/mingw/plugins/sqldrivers/qsqlmysql4.dll" QLibraryPrivate::loadPlugin failed on "C:/QtSDK/Desktop/Qt/4.8.0/mingw/plugins/sqldrivers/qsqlmysql4.dll" : "Cannot load library C:/QtSDK/Desktop/Qt/4.8.0/mingw/plugins/sqldrivers/qsqlmysql4.dll: La procédure spécifiée est introuvable." "Cannot load library C:/QtSDK/Desktop/Qt/4.8.0/mingw/plugins/sqldrivers/qsqlmysql4.dll: La procédure spécifiée est introuvable." could not load
Lors de la compilation je ne suis pas sûr des headers et lib MySQL à utiliser, faut il prendre ceux fournis dans connector C, dans Connector C++ ou dans Server*? mais j'ai essayé avec les 3 et à chaque fois j'obtiens le même résultat.
Merci d'avance
Xavier.
Le fichier .a n'est pa
Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.
Créer des applications graphiques en Python avec PyQt5
Créer des applications avec Qt 5.
Pas de question d'ordre technique par MP !
Le fichier .a n'est pas un plug-in à proprement parler, juste un fichier d'importation de la DLL, tu n'as pas à t'en soucier à moins d'avoir un besoin particulier.
Tu utilises bien un exécutable en release ? (Oui, chaque plug-in a une clé particulière qui dépend notamment de la version de Qt et du mode de compilation - debug ou release. Si les DLL utilisées par ton exécutable ne sont pas compilées de la même manière, Qt refusera de les charger.)
Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.
Créer des applications graphiques en Python avec PyQt5
Créer des applications avec Qt 5.
Pas de question d'ordre technique par MP !
Comme il y a une erreur de chargement de la dll, et pas un refus de la charger ("Plugin uses incompatible Qt library..."), peut-être que tu n'as pas copié libmysql.dll dans le bon répertoire ("C:/QtSDK/Desktop/Qt/4.8.0/mingw/bin").
Merci pour vos réponses rapides*!
alors pour ce qui est des .a je les ai copié avec les .dll car c'est ce qui est indiqué dans le tuto, il ne faut quand même pas les supprimer*?
Pour mon exécutable, je le lance à partir de QtCreator et j'ai essayé les deux modes release et debug et ça ne change pas le problème. Dans le mode release Qt cherche bien à me charger qsqlmysql4.dll mais n'y arrive pas:
et il reconnait bien que qsqlmysqld4.dll (version de debug si j'ai bien tout compris) ne correspond pas:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 QFactoryLoader::QFactoryLoader() looking at "C:/QtSDK/Desktop/Qt/4.8.0/mingw/plugins/sqldrivers/qsqlmysql4.dll" QLibraryPrivate::loadPlugin failed on "C:/QtSDK/Desktop/Qt/4.8.0/mingw/plugins/sqldrivers/qsqlmysql4.dll" : "Cannot load library C:/QtSDK/Desktop/Qt/4.8.0/mingw/plugins/sqldrivers/qsqlmysql4.dll: La procédure spécifiée est introuvable." "Cannot load library C:/QtSDK/Desktop/Qt/4.8.0/mingw/plugins/sqldrivers/qsqlmysql4.dll: La procédure spécifiée est introuvable." could not load
Et en mode debug, j'ai bien le comportement inverse, il a l'air d'essayer de charger la version de debug sans y arriver et rejette bien la version release:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 QFactoryLoader::QFactoryLoader() looking at "C:/QtSDK/Desktop/Qt/4.8.0/mingw/plugins/sqldrivers/qsqlmysqld4.dll" In C:/QtSDK/Desktop/Qt/4.8.0/mingw/plugins/sqldrivers/qsqlmysqld4.dll: Plugin uses incompatible Qt library expected build key "Windows mingw release full-config", got "Windows mingw debug full-config" "The plugin 'C:/QtSDK/Desktop/Qt/4.8.0/mingw/plugins/sqldrivers/qsqlmysqld4.dll' uses incompatible Qt library. Expected build key "Windows mingw release full-config", got "Windows mingw debug full-config"" not a plugin
Je suppose donc qu'il faudrait savoir ce que signifie «La procédure spécifiée est introuvable»…
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 QFactoryLoader::QFactoryLoader() looking at "C:/QtSDK/Desktop/Qt/4.8.0/mingw/plugins/sqldrivers/qsqlmysql4.dll" In C:/QtSDK/Desktop/Qt/4.8.0/mingw/plugins/sqldrivers/qsqlmysql4.dll: Plugin uses incompatible Qt library expected build key "Windows mingw debug full-config", got "Windows mingw release full-config" "The plugin 'C:/QtSDK/Desktop/Qt/4.8.0/mingw/plugins/sqldrivers/qsqlmysql4.dll' uses incompatible Qt library. Expected build key "Windows mingw debug full-config", got "Windows mingw release full-config"" not a plugin QFactoryLoader::QFactoryLoader() looking at "C:/QtSDK/Desktop/Qt/4.8.0/mingw/plugins/sqldrivers/qsqlmysqld4.dll" QLibraryPrivate::loadPlugin failed on "C:/QtSDK/Desktop/Qt/4.8.0/mingw/plugins/sqldrivers/qsqlmysqld4.dll" : "Cannot load library C:/QtSDK/Desktop/Qt/4.8.0/mingw/plugins/sqldrivers/qsqlmysqld4.dll: La procédure spécifiée est introuvable." "Cannot load library C:/QtSDK/Desktop/Qt/4.8.0/mingw/plugins/sqldrivers/qsqlmysqld4.dll: La procédure spécifiée est introuvable." could not load
Pour ce qui est de libmysql.dll j'en ai bien copié un dans C:/QtSDK/Desktop/Qt/4.8.0/mingw/bin mais j'en avais plusieurs d'installés avec MySQL, savez-vous s'il faut prendre la version fournie dans «*MySQL Server 5.5*», dans «*Connector C 6.0.2\lib\debug*», ou dans «*Connector C 6.0.2\lib\opt*»*?
Je n'ai trouvé aucune information traitant de l'installation de versions récentes de MySQL et n'ai aucune idée de s'il faut utiliser les fichiers «serveur» ou «connecteurs» si vous en savez plus, je suis preneur.
Merci à vous
Xavier.
Il faut prendre le libmysql.dll qui se trouve dans le répertoire que tu as passé à qmake dans la variable "LIBS", donc normalement celui de "*MySQL Server 5.5*".
Juste pour être sûr, c'est bien MySQL 32 bits que tu as téléchargé ?
J'ai pris la dll dans le même dossier que les headers et libs mais je n'ai vu marqué nulle part que c'était bien le dossier serveur et pas un des connecteurs donc j'aurai bien aimé une référence ou une explication claire de qui sert à quoi.
Pour la version, c'est bien du 32 bits et le serveur fonctionne normalement donc je ne pense pas qu'il y ai de soucis de ce côté là.
Je viens de recompiler les plugins avec les headers et lib de mysql-essential-5.1.61 mais cela ne change rien, j'ai toujours le message «*La procédure spécifiée est introuvable*» au chargement.
Si quelqu'un a le début d'une idée de solution…
Merci.
BTW, le journal d'événements Windows n'aurait-il pas quelques informations supplémentaires, au cas où ? (Là, c'est assez sibyllin...)
Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.
Créer des applications graphiques en Python avec PyQt5
Créer des applications avec Qt 5.
Pas de question d'ordre technique par MP !
En fait, quand il n'y a pas libmysql.dll, l'erreur est "Le module spécifié est introuvable."
Je viens de recompiler à partir de mysql-5.5.21-win32.zip et il n'y a pas de problème à l'exécution, donc ça doit venir du paquet mysql que tu as téléchargé (ou peut-être de l'UAC de Windows Vista ou 7, ou d'un antivirus).
Tu n'as besoin que de décompresser les répertoires "lib" et "include", dans "C:\MySQL" par exemple, puis de taper les commandes:
Le "build_all" sert à compiler et installer les fichiers dll des versions Debug et Release dans le répertoire mingw/bin de Qt, puisque depuis que la structure du SDK a changé, les sources ne sont plus "configurés" et ça ne compile et n'installe que la version Debug par défaut.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 qmake "CONFIG+=build_all" "INCLUDEPATH+=C:/MySQL/include" "QMAKE_LIBDIR+=C:/MySQL/lib/" make make install
J'attendais désespérément une réponse de votre part, en oubliant juste d'avoir posté ma réponse…
Alors pour le journal d'évènements, il n'y en a aucun à l'heure à laquelle je lance mon application.
Pour ce qui est de recompiler, j'ai essayé avec tes commandes alexisdm avec une version de mysql réputée marcher et j'ai exactement le même comportement c'est à dire pas de soucis à la compil, des erreurs d'install donc je copie à la main et pas de chargement à l'exécution avec le message « La procédure spécifiée est introuvable ».
Je vais tester avec la version 5.5.21…
Je viens d'essayer avec Mysql 5.5.21 et j'ai toujours le même résultat…
Comme j'ai installé plusieurs environnements Qt est-ce que ça ne peut pas venir d'un soucis de variables environnement*et comment peut on être sûr que toutes les variables nécessaires sont bien positionnées*?
Tu peux essayer en modifiant le fichier qui lance la console de Qt (C:/QtSDK/Desktop/Qt/4.8.0/mingw/bin/qtenv2.bat ou une copie) pour n'y mettre que les chemins de Qt et de Windows et forcer le QMAKESPEC:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 echo off echo Setting up environment for Qt usage... set QTDIR=C:\QtSDK\Desktop\Qt\4.8.0\mingw set PATH=C:\QtSDK\mingw\bin;%QTDIR%\bin;%SystemRoot%\System32 set QMAKESPEC=win32-g++
J'ai essayé en modifiant les variables comme indiqué et cette fois j'obtiens au make l'erreur*: «*Le point d'entrée de procédure _ZSt9terminatev est introuvable dans la bibliothèque de liens dynamiques libstdc++-6.dll*»
Est ce que ça ne veut pas dire qu'il manque des choses dans le path*?
On m'a conseillé d'investiguer l'erreur de chargement du plugin avec le logiciel dependency walker et celui-ci m'indique que 3 dll sont introuvables pour qsqlmysql4.dll*: LIBMYSQL.DLL, MSVCR90.DLL et IESHIMS.DLL
Pour ce qui est de libmysql, en copiant celui fournit avec MySQL dans le dossier des plugins je n'ai plus d'erreur, par contre je ne comprends pas pourquoi il a besoin d'un fichier relatif à visual C++ (si je ne me trompe pas sur le nom) alors que je compile avec mingw. Faut il modifier quelque chose dans la compil ou faut il copier un msvcr90.dll quelque part (j'en ai plusieurs sur le disque dur)*?
Enfin je ne me suis pas encore attaqué à ieshims.dll mais si vous avez une idée, je suis preneur…
La DLL a été compilée avec VC, c'est pour ça que tu dois chipoter pour l'utiliser avec MinGW. Normalement, installer le bon paquet de redistribuables résout le problème.
IESHIMS est une DLL d'Internet Explorer et on peut espérer raisonnablement qu'elle soit disponible sur le système de base - disponible dans le dossier %PROGRAMFILES%\Internet Explorer, théoriquement.
Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.
Créer des applications graphiques en Python avec PyQt5
Créer des applications avec Qt 5.
Pas de question d'ordre technique par MP !
Pourtant c'est moi qui compile qsqlmysql4.dll avec mingw donc je ne comprends pas cette dépendance à VC, s'agit il des restes de ma tentative d'utilisation de visual studio (je fais pourtant un clean avant le make) ou est-ce normal d'avoir cette dépendance (est-ce que ça peut être liée à la dll fournie par MySQL) ?
Salut, il faut que le fichier libmysql.dll soit dans un dossier étant le PATH et pas avec les fichiers des plugins, et les fichier *.a des plugins ne sont pas utils pour l'execution ou le chargement de ces derniers.
Partager