一、 开发环境
1. Qt5.7.0
2. PostgreSQL10.11
3. 系统版本
以下截图均来自于:Win10专业版1903(OS内部版本 18362.476)
待测试环境:Win7旗舰版6.1(内部版本7601:Service Pack 1)
(Vmware虚拟机,镜像文件:cn_windows_7_ultimate_with_sp1_x64_dvd_u_677408.iso,来源MSDN)
二、 创建项目
一路默认配置足够了,甚至路径也可以默认
具体创建过程如下:
- 创建新项目。打开QtCreator,点击
Projects
界面的New Project
。
- 选择模板。默认
Qt Widgets Application
,点击choose
即可
- 项目介绍和位置
本项目名为HelloPg
,存放在C:\HelloPg
- 套件选择。就一个没得选。
这里可以点击详情
展开,设置各模式子文件夹的位置和名称
- 类信息。默认即可
- 项目管理。还没高级到这个程度。点击完成
- 创建完成
- 点击左下角不带虫子的绿色箭头,确认项目可以运行
三、 项目配置
1. 添加include和lib路径
双击打开HelloPg.pro
,添加如下代码
INCLUDEPATH += C:/PostgreSQL/10/include
LIBS += -LC:/PostgreSQL/10/lib -llibpq
再次运行(绿色箭头,快捷键Ctrl+R)
正常来讲,绝不会出错。这两句写的不对也不会有问题,因为到这里压根没用上
2. 测试include和lib路径是否正确可使用
双击打开mainwindow.cpp
,添加如下内容:
头文件:(和include
们在一起)
#include "libpq-fe.h"
测试代码:(放在MainWindow的构造函数里即可)
PGconn *conn=nullptr;
再次运行,成功,配置正确。
至此连接的准备已经做好了,具体如何连接指定数据库获取数据
请听下回分解
四、 可能出现的问题
1. error: libpq-fe.h: No such file or directory
找不到头文件,可能是第一步.pro
文件中·INCLUDEPATH
有错误;
也可能是mainwindow.cpp
中头文件libpq-fe.h
的添加有错误。
2. error: cannot find -libpq
找不到libpq,可能是第一步.pro
文件中·LIBS
有错误
3. error: variable ‘PGconn conn’ has initializer but incomplete type PGconn conn=nullptr;
测试代码有误。注意是指针变量。
五、 解决方案
如果Qt和PostgreSQL安装路径与本文完全一致,以上错误只要认真检查复制代码,内容和位置正确就可以解决。
如果安装路径不同,或者碰到了疑难杂症,需要自行修改添加的代码内容,这里提醒注意几点:
1. 添加include
INCLUDEPATH += C:/PostgreSQL/10/include
INCLUDEPATH
自动补全最保险;复制过去变了颜色也是对的,说明识别为关键字了- 后面的内容其实就是路径,从资源管理器直接复制是:
C:\PostgreSQL\10\include
注意到斜杠方向不同,改一下。观察
.pro
文件前面的代码,显然反斜杠’\‘是用来换行的,留不得
2. 添加lib
LIBS += -LC:/PostgreSQL/10/lib -llibpq
LIBS
也是关键字,自动补全稳妥,复制过去变色也是对的- 文件夹路径为:
C:\PostgreSQL\10\lib
,同样要修改斜杠方向 - 内容的格式为
-L路径 -llibpq
。
-L
和-l
后面都没有空格,直接写路径和文件名
后半句两个l
并不是笔误重复,-l
是命令选项,libpq
是文件名,不要乱删。 - 路径中不能出现空格的原因,就是这里。
空格会破坏这句话的结构,导致无法找到目标文件夹
3. 头文件和测试代码
- 相信QtCreator的自动补全。能自动补全出来,最起码说明它能找得到头文件和类
- 指针变量才能赋值为空指针,名字无所谓,星号
*
必须有。 nullptr
或者NULL
都行,别整出来null
难为Qt
4. PostgreSQL9.3.25重定义错误
如果使用的是PostgreSQL9.3.25,这里会报重定义的错误
PostgreSQL的include
路径下pthread.h
文件中,有结构体timespec
的定义;
同时在Qt的Tools\mingw530_32\i686-w64-mingw32\include\sys
路径下timeb.h
文件里,也有timespec
的定义
此问题可以通过修改其中一个文件的结构体名称解决,也可以用高版本的pthread.h
文件替换解决