PostgreSQL and Trying to connect using Qt
-
Hi nHx4U, I work with PostgreSQL and Qt5,2 on Unix and Win7 64.
On Win7 I installed PSQL 32 and Qt 5.2 with mingw32. After setting up a 2nd Win7 machine I had similar problems as you have now.
Firstly they had been caused by an old PSQL 64 install, which had not completely been removed.
When removed and restarted, I still encountered the "QSqlDatabase: QPSQL driver not loaded" problem. After deleting all entries in the Application Build directory (Debug/Release) and building the project it works fine! -
currently following this tuto:
http://qt-project.org/wiki/How-to-build-a-static-Qt-for-Windows-MinGWI changed the powershell script to make it use QT 5.2.1, and for it to build some odbc & psql drivers (i think)
Get the Powershell script from there, read the tuto fully and do what is says, fully.......
I've changed these lines:
@78: $QtSrcUrl = "http://download.qt-project.org/official_releases/qt/5.2/5.2.1/single/qt-everywhere-opensource-src-5.2.1.7z",
169: -make libs -nomake tools -nomake examples -nomake tests -plugin-sql-odbc -plugin-sql-psql"@I'll let you know about the outcome.
Anyone figures out what I'm doing and cares to give a pointer on how to get it working (tm) from my actions so far, or to correct me :), feel free... -
i have :
c:\Qt with the binary installer version
c:\Qt\Static with the 'still compiling' static version (with the psql stuff I hope!!)c:\PgSQl93_x86 with postgres 32bit & headers, libs, the whole installer package
Also have postgres 9.1 64bit (used for work).
Can someone, somewhere, write a step by step tutorial on how do to it, what prerequisites are what, which differences need which slightly different approach.... ?
-
@aftertaf
Here's a short tutorial for Qt + PSQL:- Install Qt 5.2 32 from binary mingw32 "Qt 5.2.1 for Windows 32-bit (MinGW 4.8, OpenGL, 634 MB)"
- Install Qt 5.2 Sorces
- Install PostgreSQL 32-bit
- Compile the QPSQL plugin
REM:
a. Check the PATH (mingw and postgresql\bin and lib)
b. I could not manage to have both PSQL 32 and 64 working together on one Win7 - only the 32-Bit works and it only worked after completely uninstalling PSQL 64 and build my own Qt-Applications completely new in a clean directory!Hope this is useful for you
-
grrrrrrrrrrr
@xcopy /s /q /y /i C:\Qt\Static\src\qt-everywhere-opensource-src-5.2.1\qtbase\mks
pecs\winphone-arm-msvc2012 C:\Qt\Static\5.2.1\mkspecs\winphone-arm-msvc2012
2 File(s) copied
xcopy /s /q /y /i C:\Qt\Static\src\qt-everywhere-opensource-src-5.2.1\qtbase\mks
pecs\winphone-x86-msvc2012 C:\Qt\Static\5.2.1\mkspecs\winphone-x86-msvc2012
2 File(s) copied
xcopy /s /q /y /i C:\Qt\Static\src\qt-everywhere-opensource-src-5.2.1\qtbase\mks
pecs\winrt-arm-msvc2012 C:\Qt\Static\5.2.1\mkspecs\winrt-arm-msvc2012
2 File(s) copied
xcopy /s /q /y /i C:\Qt\Static\src\qt-everywhere-opensource-src-5.2.1\qtbase\mks
pecs\winrt-x64-msvc2012 C:\Qt\Static\5.2.1\mkspecs\winrt-x64-msvc2012
2 File(s) copied
xcopy /s /q /y /i C:\Qt\Static\src\qt-everywhere-opensource-src-5.2.1\qtbase\mks
pecs\winrt-x86-msvc2012 C:\Qt\Static\5.2.1\mkspecs\winrt-x86-msvc2012
2 File(s) copied
xcopy /s /q /y /i C:\Qt\Static\src\qt-everywhere-opensource-src-5.2.1\qtbase\doc
\global C:\Qt\Static\5.2.1\doc\global
58 File(s) copied
mingw32-make[1]: Target 'install' not remade because of errors.
mingw32-make[1]: Leaving directory 'C:/Qt/Static/src/qt-everywhere-opensource-sr
c-5.2.1/qtbase'
makefile:72: recipe for target 'module-qtbase-install_subtargets' failed
mingw32-make: *** [module-qtbase-install_subtargets] Error 2
mingw32-make: Target 'install' not remade because of errors.
Press Enter to continue...:@ -
[quote author="clochydd" date="1391800040"]aftertaf
Here's a short tutorial for Qt + PSQL:- Install Qt 5.2 32 from binary mingw32 "Qt 5.2.1 for Windows 32-bit (MinGW 4.8, OpenGL, 634 MB)"
- Install Qt 5.2 Sorces [/quote]
-> during install of 'binary' in step above?,
-> as a tarball just uninflated somewhere 'clean'?
[quote]3. Install PostgreSQL 32-bit [/quote]
->ok, i'll switch now and completely purge x64 9.1 +9.3 from this system
[quote]4. Compile the QPSQL plugin [/quote]
@
include <n00b.h>
#IFNDEF compile, what do i do?
@
i.e. us n00bs, even if we've compiled kernels and broken our teeth on linux, we know how to speak PC in a broad sense, but this is a bit like reading 'the matrix' for us, and we ARE trying....I've tried like 50 times to follow the QODBC & QPSQL stuff via google and qt project docs, and something (different every time) ain't working, and my n00bness combined with the fact i'm gutting my system of QT binary & source over and over means i dont understand and can't remember the errors i'm having.
I've been trying for the past 2 weeks in silence and solitude before bleeding out here...[quote]REM:
a. Check the PATH (mingw and postgresql\bin and lib) [/quote]
->the SET PATH env variable , to be sure they're both in there for the system and for the cmd prompts i've been launching??
Yep.[quote]b. I could not manage to have both PSQL 32 and 64 working together on one Win7 - only the 32-Bit works and it only worked after completely uninstalling PSQL 64 and build my own Qt-Applications completely new in a clean directory! [/quote]
OK, cleaning up (again), this time PGx64 too[quote]Hope this is useful for you [/quote]
me too, will let you know :) -
@aftertaf: I have modified my tutorial so that now you will see all steps from downloading to building the plugins.
This is what I've done to make Qt 32-bit and PSQL 32-bit work on Win7 64-Bit:-
Prepare compiling of the plugin (Lets assume we install Qt + Sources to C:\Qt, PostgresSQL to C:\Programs(86x)):
-
Download Qt 5.2.1 32-bit: http://download.qt-project.org/official_releases/qt/5.2/5.2.1/qt-opensource-windows-x86-mingw48_opengl-5.2.1.exe
-
Run the .exe, install to C:\Qt\Qt5.2.1
-
Download sources: http://download.qt-project.org/official_releases/qt/5.2/5.2.1/single/qt-everywhere-opensource-src-5.2.1.zip
-
Extract zip to C:\Qt\Qt5.2.1
-
Download PostGreSQL 32-bit: http://www.enterprisedb.com/postgresql-932-1-installers-win32?ls=Crossover&type=Crossover
-
Modify PATH:
set QTSDK_SQLDRIVERS_PATH=C:\Qt\Qt5.2.0\5.2.1\mingw48_32\plugins\sqldrivers
set QT_SRC_PATH=C:\Qt\Qt5.2.1\5.2.1\Src\qtbase
set POSTGRES32=C:\Progra~2\PostgreSQL\9.3 (USE Progra~2 FOR Programs(86x)!) -
cd %QT_SRC_PATH%\src\plugins\sqldrivers\psql
-
add permanently to PATH (Control Panel): C:\Qt\Qt5.2.1\Tools\mingw48_32\bin
-
modify C:\Progra~2\PostgreSQL\9.3\include\pthread.h (multiple definitions of struct timespec):
replace: #ifndef HAVE_STRUCT_TIMESPEC
with: #if ((!defined(_TIMESPEC_DEFINED)) && (!defined(HAVE_STRUCT_TIMESPEC))) -
start building the plugins:
C:\Qt\Qt5.2.0\5.2.0\mingw48_32\bin\qmake "INCLUDEPATH+=%POSTGRES32%\include" "LIBS+=%POSTGRES32%\lib\libpq.lib" psql.pro
mingw32-make debug
mingw32-make release -
copy the newly created plugins to C:\Qt\Qt5.2.0\5.2.1\mingw48_32\plugins\sqldrivers:
copy release\libqsqlpsql.a %QTSDK_SQLDRIVERS_PATH%
copy release\qsqlpsql.dll %QTSDK_SQLDRIVERS_PATH%
copy debug\libqsqlpsqld.a %QTSDK_SQLDRIVERS_PATH%
copy debug\qsqlpsqld.dll %QTSDK_SQLDRIVERS_PATH%
-
-
1: Thanks for taking time out :)
2: OK, i've just reviewed and adapted to my environment slightlyI get this error:
@g++ -c -pipe -fno-keep-inline-dllexport -g -std=c++0x -fno-exceptions -frtti -Wall -Wextra -DUNICODE -DQT_NO_CAST_TO_ASCII -DQT_NO_CAST_FROM_ASCII -DQT_NO_EXCEPTIONS -DQT_PLUGIN -DQT_SQL_LIB -DQT_CORE_LIB -I. -I"C:\Qt\5.2.1\mingw48_32\include\QtSql\5.2.1" -I"C:\Qt\5.2.1\mingw48_32\include\QtSql\5.2.1\QtSql" -I"C:\Qt\5.2.1\mingw48_32\include" -I"C:\Qt\5.2.1\mingw48_32\include\QtSql" -I"C:\Qt\5.2.1\mingw48_32\include\QtCore\5.2.1" -I"C:\Qt\5.2.1\mingw48_32\include\QtCore\5.2.1\QtCore" -I"C:\Qt\5.2.1\mingw48_32\include\QtCore" -I".moc\debug" -I"........\mkspecs\win32-g++" -o .obj\debug\qsql_psql.o ......\sql\drivers\psql\qsql_psql.cpp
......\sql\drivers\psql\qsql_psql.cpp:59:22: fatal error: libpq-fe.h: No suchfile or directory
#include <libpq-fe.h>
^
compilation terminated.
Makefile.Debug:497: recipe for target '.obj/debug/qsql_psql.o' failed
mingw32-make[1]: *** [.obj/debug/qsql_psql.o] Error 1
mingw32-make[1]: Leaving directory 'c:/QT/5.2.1/Src/qtbase/src/plugins/sqldrivers/psql'
makefile:48: recipe for target 'debug' failed
mingw32-make: *** [debug] Error 2@my path & env.vars set in the dos prompt:(which matches, i have triple checked)
set QTSDK_SQLDRIVERS_PATH=C:\QT\5.2.1\mingw48_32\plugins\sqldrivers
set QT_SRC_PATH=c:\QT\5.2.1\Src\qtbase
set POSTGRES32=c:\psql93_x86C:\Qt\5.2.1\mingw48_32\bin;C:\Qt\Tools\mingw48_32\bin;C:\Qt\Tools\QtCreator\bin;C:\psql93_x86\bin;C:\psql93_x86\lib;C:\psql93_x86\include;C:\psql93_x86\include\libpq;C:\Perl\site\bin;C:\Perl\bin;C:\Windows;C:\Windows\system32;C:\Windows\System32\WindowsPowerShell\v1.0\C:\Windows\System32\Wbem;C:\trace;C:\trace\dll;c\trace\prod;C:\windev55;c:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn;c:\Program Files (x86)\Microsoft SQL Server\100\DTS\Binn;c:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE;C:\Program Files (x86)\Microsoft Application Virtualization Client;C:\Program Files\doxygen\bin
-
But c:\pgsql93_86\include\ is not in the maker's includepath
See my suggestion item 11.:
[11. start building the plugins:
C:\Qt\Qt5.2.0\5.2.0\mingw48_32\bin\qmake “INCLUDEPATH+=%POSTGRES32%\include” “LIBS+=%POSTGRES32%\lib\libpq.lib” psql.pro]
good luck! -
And what if you replace %POSTGRES32% with the actual path BUT using forward slashes
-
result (again)
@C:\QT\5.2.1\Src\qtbase\src\plugins\sqldrivers\psql>C:\Qt\5.2.1\mingw48_32\bin\qmake "INCLUDEPATH+=c:/psql93_x86/include" "LIBS+=c:/psql93_x86/lib/libpq.lib" psql.proC:\QT\5.2.1\Src\qtbase\src\plugins\sqldrivers\psql>mingw32-make debug
mingw32-make -f Makefile.Debug
mingw32-make[1]: Entering directory 'C:/QT/5.2.1/Src/qtbase/src/plugins/sqldrivers/psql'
g++ -c -pipe -fno-keep-inline-dllexport -g -std=c++0x -fno-exceptions -frtti -Wall -Wextra -DUNICODE -DQT_NO_CAST_TO_ASCII -DQT_NO_CAST_FROM_ASCII -DQT_NO_EXCEPTIONS -DQT_PLUGIN -DQT_SQL_LIB -DQT_CORE_LIB -I. -I"C:\Qt\5.2.1\mingw48_32\include\QtSql\5.2.1" -I"C:\Qt\5.2.1\mingw48_32\include\QtSql\5.2.1\QtSql" -I"C:\Qt\5.2.1\mingw48_32\include" -I"C:\Qt\5.2.1\mingw48_32\include\QtSql" -I"C:\Qt\5.2.1\mingw48_32\include\QtCore\5.2.1" -I"C:\Qt\5.2.1\mingw48_32\include\QtCore\5.2.1\QtCore" -I"C:\Qt\5.2.1\mingw48_32\include\QtCore" -I".moc\debug" -I"........\mkspecs\win32-g++" -o .obj\debug\qsql_psql.o ......\sql\drivers\psql\qsql_psql.cpp
......\sql\drivers\psql\qsql_psql.cpp:59:22: fatal error: libpq-fe.h: No such file or directory
#include <libpq-fe.h>
^
compilation terminated.
Makefile.Debug:497: recipe for target '.obj/debug/qsql_psql.o' failed
mingw32-make[1]: *** [.obj/debug/qsql_psql.o] Error 1
mingw32-make[1]: Leaving directory 'C:/QT/5.2.1/Src/qtbase/src/plugins/sqldrivers/psql'
makefile:48: recipe for target 'debug' failed
mingw32-make: *** [debug] Error 2
@Relevant env vars:(edited for readability)
Path=
C:\Qt\5.2.1\mingw48_32\bin;
C:\Qt\Tools\mingw48_32\bin;
C:\Qt\Tools\QtCreator\bin;
C:\psql93_x86\bin;
C:\psql93_x86\lib;
C:\psql93_x86\include;
C:\psql93_x86\include\libpq;
C:\Perl\site\bin;
C:\Perl\bin;
C:\Windows;
C:\Windows\system32;
C:\Program Files\doxygen\bin
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.BPL;.lib
POSTGRES32=c:\psql93_x86
POSTGRES322=c:/psql93_x86
QTSDK_DRIVERSPATH=C:\QT\5.2.1\mingw48_32\plugins\sqldrivers
QTSDK_DRIVERSPATH2=C:/QT/5.2.1/mingw48_32/plugins/sqldrivers
QT_SRC_PATH=C:\Qt\5.2.1\Src\qtbase
QT_SRC_PATH2=C:/Qt/5.2.1/Src/qtbase -
tried a different approach, still NOK.
copied all of the c:\psql93_x86\include folder (+subdirs) into C:\QT\5.2.1\Src\qtbase\src\plugins\sqldrivers\psql (directory the make enters before the fail)
it gets further before borking.
@C:\Qt\5.2.1\mingw48_32\bin\moc.exe -DUNICODE -DQT_NO_CAST_TO_ASCII -DQT_NO_CAST_FROM_ASCII -DQT_NO_EXCEPTIONS -DQT_PLUGIN -DQT_SQL_LIB -DQT_CORE_LIB -D__GNUC__-DWIN32 -I. -I"C:\Qt\5.2.1\mingw48_32\include\QtSql\5.2.1" -I"C:\Qt\5.2.1\mingw48_32\include\QtSql\5.2.1\QtSql" -I"C:\Qt\5.2.1\mingw48_32\include" -I"C:\Qt\5.2.1\mingw48_32\include\QtSql" -I"C:\Qt\5.2.1\mingw48_32\include\QtCore\5.2.1" -I"C:\Qt\5.2.1\mingw48_32\include\QtCore\5.2.1\QtCore" -I"C:\Qt\5.2.1\mingw48_32\include\QtCore" -I".moc\debug" -I"........\mkspecs\win32-g++" ......\sql\drivers\psql\qsql_psql_p.h -o .moc\debug\moc_qsql_psql_p.cpp
g++ -c -pipe -fno-keep-inline-dllexport -g -std=c++0x -fno-exceptions -frtti -Wall -Wextra -DUNICODE -DQT_NO_CAST_TO_ASCII -DQT_NO_CAST_FROM_ASCII -DQT_NO_EXCEPTIONS -DQT_PLUGIN -DQT_SQL_LIB -DQT_CORE_LIB -I. -I"C:\Qt\5.2.1\mingw48_32\include\QtSql\5.2.1" -I"C:\Qt\5.2.1\mingw48_32\include\QtSql\5.2.1\QtSql" -I"C:\Qt\5.2.1\mingw48_32\include" -I"C:\Qt\5.2.1\mingw48_32\include\QtSql" -I"C:\Qt\5.2.1\mingw48_32\include\QtCore\5.2.1" -I"C:\Qt\5.2.1\mingw48_32\include\QtCore\5.2.1\QtCore" -I"C:\Qt\5.2.1\mingw48_32\include\QtCore" -I".moc\debug" -I"........\mkspecs\win32-g++" -o .obj\debug\moc_qsql_psql_p.o.moc\debug\moc_qsql_psql_p.cpp
g++ -shared -Wl,--out-implib,C:\QT\5.2.1\Src\qtbase\plugins\sqldrivers\libqsqlpsqld.a -o ........\plugins\sqldrivers\qsqlpsqld.dll .obj/debug/main.o .obj/debug/qsql_psql.o .obj/debug/moc_qsql_psql_p.o -lpq -LC:\Qt\5.2.1\mingw48_32\lib -lQt5Sqld -lQt5Coredc:/qt/tools/mingw48_32/bin/../lib/gcc/i686-w64-mingw32/4.8.0/../../../../i686-w64-mingw32/bin/ld.exe: cannot find -lpq
collect2.exe: error: ld returned 1 exit status
Makefile.Debug:80: recipe for target '........\plugins\sqldrivers\qsqlpsqld.dll' failed
mingw32-make[1]: *** [........\plugins\sqldrivers\qsqlpsqld.dll] Error 1
mingw32-make[1]: Leaving directory 'C:/QT/5.2.1/Src/qtbase/src/plugins/sqldrivers/psql'
makefile:48: recipe for target 'debug' failed
mingw32-make: *** [debug] Error 2@
i'm so close i can smell the SELECT*, but still no cigar -
You are using mingw32's gcc to compile qt and trying to use postgreql library compiled with MSVC.
MSVC uses .LIB for libraries while Mingw32 (gcc + binutils) uses .a or .so files for libraries.
You can try either of the following methods: a. compile Qt using MSVC. b. use mingw32 to compile postgresql and use its libraries.
From:
http://stackoverflow.com/questions/5487236/building-qt-postgresql-driveranyone have an easy to follow 'how to build postgres from sources with mingw '?
or easier still, how to "use" the "QT" ODBC driver instead? -
...
just build libpq.a from sources . . . .
http://pgolub.wordpress.com/2008/12/15/building-postgresql-client-library-using-mingw-under-winxp-sp3/don't know what to do with it.
sorry for by n00bness, people... -
It is not necessary to compile postgresql, I used the binaries 32-bit and with installing ./lib and ./include had been provided, too.
Your make does not recognise the psql includes (the stuff, that follows -I) and that's why you still receive the message 'libpq-fe.h not found'.
Do you see the same error if you use backslashed paths with you qmake command? Qt uses forward slashes but I had success with the backslashed command. -
Just to be sure, wouldn't by any chance libpq-fe.h be in include/libpq ? If so it's that last element that was missing.
-
Indeed, but you need to give the full path to libqp-fe.h not just the path that contains the libpq folder.
Please avoid having spaces in your path when developing, it something that is not working very well on windows