Je vais décrire ici la compilation du plugins Qpsql QT version 5.0.2 sous compilation MingWin 32 bits version 4.7.
Et juste parce ce que ce fut un peu la galère pour y aboutir, donc cela vaut bien un petit mémo.
J’utilise ici la version 32 bits de posgresql version 9.2.4, ainsi que QT 5.0.2 sous MingWin32 bits version 4.7.
Nb: ne pas se soucier de la version de MingWin, ce compilateur est fourni avec l’installation de QT 5.0.2., a l’heure de la rédaction de ce post, c’est la version 5.1 de QT qui est disponible avec la version 4.8 de MingWin 32 bits, je pense que le principe de la compilation ne changera pas beaucoup.
Étapes importantes :
– Vous pouvez télécharger les binaires de postgres version 9.2.4 à l’adresse suivante :
http://www.enterprisedb.com/products...wnload#windows.
– Vous pouvez télécharger QT 5.0.2 pour MingWin 32 bits à l’adresse suivante :
http://qt-project.org/downloads
- Installer postgresql, en suivant les étapes standard de l’installation, vous pouvez installer postgresql sous le répertoire c:\program files, peut importe le répertoire d’installation même s’il comporte des espaces, on corrigera le fichier Makefile en conséquence.
- Vérifiez bien que suite à l’installation de postgresql vous retrouvez bien dans le répertoire d’installation de postgresql, les sous répertoires « include » et « lib ».
- Installez QT si ce n’est pas fait, mais en installant également les fichiers sources de QT, vous pouvez installer ces sources à postériori (attention cela peut parfois casser votre configuration précédente).
- Vérifiez bien que vous retrouvez bien le répertoire %QTDIR%\Src\qtbase\src\plugins\sqldrivers\psql, en effet ce répertoire contient les sources pour le plugins drivers psql, a vérifier également la présence du répertoire %QTDIR%\Src\qtbase\src\sql\drivers\psql qui contient aussi des fichiers sources nécessaires à la compilation de notre plugins.
Modifier le fichier %QTDIR%\Src\qtbase\src\plugins\sqldrivers\psql\psql.pro , en y ajoutant l’ option suivante :
Code Qt-pro : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 | TARGET = qsqlpsql DEFINES += HAVE_STRUCT_TIMESPEC SOURCES = main.cpp OTHER_FILES += psql.json include(../../../sql/drivers/psql/qsql_psql.pri) PLUGIN_CLASS_NAME = QPSQLDriverPlugin include(../qsqldriverbase.pri) |
Pourquoi ? : Simplement parce que certains fichiers include se trouvant dans le répertoire include de postgresql redéfinissent également la structure TimeSpec, et qu’il est impératif de spécifier à notre compilateur d’utiliser la structure se trouvant dans le fichier C:\Program Files\PostgreSQL\9.2\include\pthread.h, ce fichier include défini une macro HAVE_STRUCT_TIMESPEC
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 | #ifndef HAVE_STRUCT_TIMESPEC #define HAVE_STRUCT_TIMESPEC 1 struct timespec { long tv_sec; long tv_nsec; }; #endif /* HAVE_STRUCT_TIMESPEC */ |
Et c’est cette structure que doit utiliser notre compilateur et non celle qui se trouve dans le fichier timeb.h du répertoire include de notre compilateur C:\Qt\Qt5.0.2\Tools\MinGW\i686-w64-mingw32\include\sys\timeb.h
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 | #ifndef _TIMESPEC_DEFINED #define _TIMESPEC_DEFINED struct timespec { time_t tv_sec; /* Seconds */ long tv_nsec; /* Nanoseconds */ }; |
Créer les fichiers Makefile
on va utiliser pour cela qmake.
Ouvrir une console cmd avec les variables QT correctement défini, cool QT nous propose cela dans le menu démarrer de l’application
se mettre dans le répertoire du fichier psql.pro
cd %QTDIR%\src\plugins\sqldrivers\psql
et exécuter qmake avec les paramétres suivants :
qmake « INCLUDEPATH+=C:\Program Files\PostgreSQL\9.2\include » « LIBS+=C:\Program Files\PostgreSQL\9.2\lib » psql.pro
Ceci permet de générer les fichiers Makefile, Makefile.debug et Makefile.release, en spécifiant par la même occasion les chemin de recherche des fichier include et du fichier libpq.lib
Modifier les fichiers Makefile
Qmake supporte mal les noms de répertoire avec un espace, il faudra donc corriger dans ces 3 fichiers Makefile, les répertoires comportant c:\program files
notamment les lignes suivantes, qui se trouvent en début de fichier
Code shell : | Sélectionner tout |
1 2 3 4 | INCPATH = -I. -I"C:\Program Files\PostgreSQL\9.2\include" -I"C:\Qt\Qt5.0.2\5.0.2\mingw47_32\include" -I"C:\Qt\Qt5.0.2\5.0.2\mingw47_32\include\QtSql" -I"C:\Qt\Qt5.0.2\5.0.2\mingw47_32\include\QtSql\5.0.2" -I"C:\Qt\Qt5.0.2\5.0.2\mingw47_32\include\QtSql\5.0.2\QtSql" -I"C:\Qt\Qt5.0.2\5.0.2\mingw47_32\include\QtCore" -I".moc\release_shared" -I"..\..\..\..\mkspecs\win32-g++" LIBS = "C:\Program Files\PostgreSQL\9.2\lib\libpq.lib" -LC:\Qt\Qt5.0.2\5.0.2\mingw47_32\lib -lQt5Sql -lQt5Core |
Lancer la compilation
Dans le répertoire courant qui doit être %QTDIR%\src\plugins\sqldrivers\psql, exécutez la commande mingwin32-make.
Et normalement ça compile => et mingwin32 nous génère deux DLL qsqlpsqld.dll (version Debug) et qsqlpsql.dll (version Release plus légère) dans le répertoire ..\..\..\..\plugins\sqldrivers
Mettre en prod ces DLL
il ne vous reste plus qu’a copier les DLL dans le répertoire %QTDIR%\plugins\sqldrivers, vous trouverez d’autres DLL dans ce répertoire, notamment cette pour le drivers ODBC3.
nb : ne pas copier les fichiers d’extension « .a » (inutile sous Windows)
Faire pointer la variable système %PATH% vers les DLL de postgresql, pour cela on va simplement ajouter à notre variable %PATH% le chemin suivant :
C:\Program Files\PostgreSQL\9.2\bin
pour que notre drivers puisse accéder à la DLL libpq.dll, impératif pour-qu’il fonctionne correctement.
FIN