IT评测·应用市场-qidao123.com

标题: VS+QT使用mysql数据库,以及大概遇到的问题 [打印本页]

作者: 缠丝猫    时间: 2024-8-7 21:04
标题: VS+QT使用mysql数据库,以及大概遇到的问题
前言:我们都知道在qt中使用QSqlDatabase就可以操作数据库,使用QSqlDatabase的静态函数addDatabase就可以选择操作哪种数据库,QSQLITE大概是QMYSQL。但是自 Qt 5.1 版本开始,Qt 已经不再默认包罗 MySQL 驱动程序(QMYSQL),以是需要手动编译mysql的驱动。以下是详细步调以及大概遇到的问题


目录

1.mysql的下载和安装
2.编译数据库驱动
2.1查看mysql驱动文件是否存在
2.2.编译mysql驱动文件
2.3.验证mysql驱动是否安装成功
3.在vs中设置qt和mysql
4.大概遇到的问题
4.1在编译数据库驱动的时候,手动指定链接库,出现:-1: error: LNK1146: 没有效选项“/LIBPATH:”指定的参数
4.2在vs中使用qt的mysql,debug模式可以正常使用,但是release无法正常使用,会报此错误C1083    无法打开包括文件: “QSqlQuery”: No such file or directory 
4.3qt的编译器识别不上,大概识别错误
4.3.1在设置之前需要先下载编译器,打开vs installer
4.3.2下载完成后,安装msvc调试器
4.3.3手动添加编译器
4.4使用mysql,debug模式和release模式编译运行都可以成功,但是生成的文件夹中.exe文件出现无法定位程序输入点的问题。
4.5使用windeployqt打包好的程序,无法使用数据库相干功能
4.6数据库....一些理解
4.6.1内网穿透(NAT穿透)
4.6.2其他电脑访问我们的mysql
4.6.3sqlite轻量型数据库








1.mysql的下载和安装

下载mysql,csdn上有很多教程,本文主要记录qt mysql驱动的编译,以是不过多介绍。
这篇文章解说的很详细。
MySQL数据库下载及安装教程(最最新版)_mysql下载安装-CSDN博客
下载成功后,将libmysql.dll复制到你要使用的编译器的bin目录中。
libmysql.dll是 MySQL 数据库客户端库的动态链接库文件,在qt大概任何需要使用数据库的程序中,都需要用到这个动态库。
通常环境下,为了让程序可以大概在运行时精确地加载和使用 该dll,需要将该 DLL 文件复制到编译后的可实行文件所在的路径下,我们要使用qt,以是放在qt的bin目录下。这样做可以确保程序在运行时可以大概找到并加载 ,从而顺遂连接到 MySQL 数据库。

下载成功后libmysql.dll的路径为
  1. C:\Program Files\MySQL\MySQL Server 8.0\lib\libmysql.dll
复制代码

我使用的编译器版本是msvc2017_64,bin路径为如图,拷贝进去
  1. D:\app\QT\5.14.2\msvc2017_64\bin
复制代码

复制成功。这个只是库的复制,但是还使用不了,qt要使用这个库,需要安装数据库驱动插件,才能精确加载这个库。
2.编译数据库驱动


2.1查看mysql驱动文件是否存在



查抄qt目录,你需要用的编译器版本的插件目录下是否存在qsqlmysql.dll。
我的路径如下。
  
  1. D:\app\QT\5.14.2\msvc2017_64\plugins\sqldrivers
复制代码
我用的版本是msvc2017_64。之前已经安装过驱动了,以下是有驱动的状态。

作为实例记录,删除这个版本重新编译。

2.2.编译mysql驱动文件

也就是缺失的这个qsqlmysql.dll。
这里需要使用到qt的数据库源码编译驱动,它是支持mysql的,只不过是没有精确安装驱动。以是我们要手动编译。
路径如下。打开mysql.pro。
  
  1. D:\app\QT\5.14.2\Src\qtbase\src\plugins\sqldrivers\mysql
复制代码

修改mysql.pro文件。
  
  1. TARGET = qsqlmysql
  2. HEADERS += $$PWD/qsql_mysql_p.h
  3. SOURCES += $$PWD/qsql_mysql.cpp $$PWD/main.cpp
  4. #QMAKE_USE += mysql
  5. #注释掉这一行,这一行的意思是默认配置mysql,通常情况下qt会默认配置mysql,
  6. #但是如果系统上没有安装mysql或者路径没有被正确配置,编译过程可能会失败
  7. #我们需要手动配置链接库的路径以及头文件路径,所以注释掉这一行默认配置
  8. OTHER_FILES += mysql.json
  9. PLUGIN_CLASS_NAME = QMYSQLDriverPlugin
  10. #加入下面这三行
  11. #链接mysql,lib库
  12. LIBS += -L"C:/Program Files/MySQL/MySQL Server 8.0/lib" -llibmysql
  13. #mysql的include路径
  14. INCLUDEPATH += "C:/Program Files/MySQL/MySQL Server 8.0/include"
  15. DEPENDPATH += "C:/Program Files/MySQL/MySQL Server 8.0/include"
  16. #虽然说windows系统使用\作为路径分隔符,但是在qt中还是建议使用/,有更好的可移植性
  17. #此外,使用正斜杠还可以避免在路径中使用转义字符,使路径更清晰易读。
  18. #另一种方式可以使用$$quote函数将路径括起来,避免路径中出现的空格还有特殊符号被错误解析
  19. #LIBS += -L$$quote(C:/Program Files/MySQL/MySQL Server 8.0/lib) -llibmysql
  20. #INCLUDEPATH += $$quote(C:/Program Files/MySQL/MySQL Server 8.0/include)
  21. #DEPENDPATH += $$quote(C:/Program Files/MySQL/MySQL Server 8.0/include)
  22. include(../qsqldriverbase.pri)
复制代码

注释掉这一行

选择要使用的编译器,我的是msvc2017_64.

点击编译,出现下列窗口,即为编译成功。
​编译成功之后,在qt的所在盘中找到plugins文件夹,我的qt是在d盘安的以是在d盘找到,默认qt在c盘安的,那就在c盘找。


如果找不到,在D:\app\QT\5.14.2\Src\qtbase\src\plugins\sqldrivers\mysql,在qt的源码路径下查找。
打开找到这两个驱动文件。

将编译好的驱动复制到你需要的编译器版本的插件目录下。
我的路径是
  
  1. D:\app\QT\5.14.2\msvc2017_64\plugins\sqldrivers
复制代码

至此,mysql的驱动安装成功。
2.3.验证mysql驱动是否安装成功

创建一个qt项目,使用代码验证。
首先打开pro设置文件,在模块后面加上sql。

随后在代码中,键入这几行代码,就会出现qt所支持的数据库,这样就表示驱动已经安装成功。
  1. QStringList drivers = QSqlDatabase::drivers();
  2.     for(QString d : drivers){
  3.        qDebug() << d;
  4.     }
复制代码


3.在vs中设置qt和mysql

第三条表示在qt中可成功使用mysql
在vs中又怎样而是用呢?
需要先设置qt,安装此插件。安装之后需要重启一下vs。
VS2017设置QT环境(详细版)_vs2017 qt-CSDN博客

设置成功后,打开qt project settings

在modules中添加sql模块。其实就是在qt的pro设置文件中加sql,只是vs和qt设置位置不一样。

之后正常参加头文件,使用mysql


4.大概遇到的问题

4.1在编译数据库驱动的时候,手动指定链接库,出现:-1: error: LNK1146: 没有效选项“/LIBPATH:”指定的参数


查抄-L与之后的路径中间有没有空格,LIBS += -L/usr/local/lib -lmylibrary,如果有空格修改就可以解决这个问题。

重新编译的时候,记得要提前删掉,sqldrivers下的build文件,如果不删除,重新编译的结果照旧上一次错误的结果。

4.2在vs中使用qt的mysql,debug模式可以正常使用,但是release无法正常使用,会报此错误C1083    无法打开包括文件: “QSqlQuery”: No such file or directory 
 



这个错误之前我以为是我的数据库驱动没编译好,当时编译选择的debug模式,我以为是需要编译release模式的才可以,反反复复编译好几遍,问题没解决,
后来才发现是在vs中使用sql模块的时候,没有选择上面的设置模式,导致之前设置只在debug模式下添加了sql模块,而release模式下没有,选择release模式添加sql即可。

4.3qt的编译器识别不上,大概识别错误

如图所示,在工具-选项-kits中,相应的编译器前有特殊符号黄色红色感叹号。如下图所示
我使用的是msvc2017_64编译器,这是已经修改过的。是可用状态。
以msvc2015_64位为例解决这个错误。这个其实就是没有精确设置编译器的意思。我们需要手动设置。

4.3.1在设置之前需要先下载编译器,打开vs installer


点击修改

点击单个组件,选择需要设置的编译器版本

点击修改等待下载

4.3.2下载完成后,安装msvc调试器

https://download.microsoft.com/download/4/2/2/42245968-6A79-4DA7-A5FB-08C0AD0AE661/windowssdk/winsdksetup.exe
下载成功安装的时候如果体现以下这个窗口,说明已经安装过了,只需要更新即可。其实对于大多数安装了VS的开发者,已经装了,如果再下载有点多余。并且如果安装了更低版本,大概提示"You must uninstall the windows software development kit"

更新步调:



4.3.3手动添加编译器

打开qt-工具-选项-kits-编译器-添加-msvc-c++


如下图所示,输入编译器名称,初始化,以及abi,不要遗漏掉每一项,vcvarsall.bat这个文件可以自利用用everything搜刮找到


点击debuggers,确定是否有这两项,之前下载的。

编译器和debuggers都设置好之后,设置套件,按对应版本设置

以上,再打开KITS,编译器设置成功,感叹号消失

4.4使用mysql,debug模式和release模式编译运行都可以成功,但是生成的文件夹中.exe文件出现无法定位程序输入点的问题。


这种问题出现的缘故原由,是找不到链接不到动态库。
解决这个错误的方式有两种,一种是将库所在路径参加环境变量,一种是将库拷贝到可实行文件目录。但是在自己本机运行,一个一个拷贝,总会有遗漏了而且有很多,以是最好的解决方式就是将bin目录参加到环境变量,如图所示

但是这里需要留意的一点就是,你用哪个版本的编译器,将其调整次序上移到最顶层,因为位置如果位于其他编译器版本之下,就可以导入进去错误的库,体系找到一个库就不会继承往下探求。
4.5使用windeployqt打包好的程序,无法使用数据库相干功能

windeployqt,打包的程序,只会拷贝qt相干的依靠库,程序可以正常运行,但是无法使用数据库功能明发的是缺少数据库相干的库。至于都要拷贝什么库,网络上的答案五花八门,我在这里写一下总结。
1.复制mysql的相干dll文件,就是我们文章开头下载mysql,带的谁人libmysql.dll。将其复制到发布目录下(.exe同级目录)。
   libmysql.dll在此目录下
  C:\Program Files\MySQL\MySQL Server 8.0\lib
  2.复制驱动文件,就是我们文章中编译的数据库驱动,使用windeployqt打包的程序,会主动生成一个sqldrivers文件夹,虽然有这个插件文件,但是由于.exe运行探求插件的时候是在plugins目录下查找,以是需要新建一个plugins文件夹,将sqldrivers复制进去
3.复制openssl相干的dll文件,很多人都不知道要复制这两个dll,当在 Qt 中使用mysql 时,通常需要包罗 openssl 库的相干dll文件,虽然我们没有在程序中体现使用,但是这两个库必须得添加,用于加密和安全通信;
在数据库bin目录下拷贝libcrypto-3-x64.dll和libssl-3-x64.dll。
   C:\Program Files\MySQL\MySQL Server 8.0\bin
  

4.6数据库....一些理解

4.6.1内网穿透(NAT穿透)

由于之前没用过mysql,不停用的sqlite,sqlite的使用比力简单,没这么繁琐,这次项目需要用数据库,想着正勤学一下mysql的相干知识,这篇文章是从最开始编译设置到发布一路踩坑总结出来的。就在我以为大功告成的时候,将我的程序在其他电脑上运行,才发现根本链接不上数据库。其实就是咱们下载的mysql是本地数据库,要想让其他电脑通过ip地址连接(也就是将我们的电脑当做数据库服务器),那么咱们的数据库需要设置答应其他电脑访问,
设置Mysql答应远程连接_mysql答应root远程登录-CSDN博客
设置也比力简单,但并不是设置了就好了的,其他电脑要访问我们的数据库时,我测试了,必须连接在同一局域网下才可以访问到这个ip,要想外网访问 ,必须将我们的数据库内网穿透,映射成外网,才可以被访问到。(也叫nat穿透,这样其他的内网才能访问到我们的主机。)至于什么是内网什么是外网,内网就是我们常说的局域网,每个局域网中有很多设备,每个局域网都有一个网关,网关管理这些设备的通信,这些设备的ip地址192.168.**.**就是所说的内网,而外网具有世界范围的唯一性,内网ip只在局域网内部有唯一性。意思就是在每个局域网下大概都有一个设备ip叫192.168.10.55。我们通信是通过网关通信的。这里贴一张图,是我在csdn上看到的。
我们自己的电脑作为此中的设备1,使用不在同一局域网下的设备是访问不到的,如果说想访问192.168.10.55,你并不知道要访问哪个局域网下的这个地址,这个时候相识到了可以将内网穿透映射成外网,这样的话,其他设备就可以访问到,但是好像需要钱并且不稳定,而且我的小项目没必要这么麻烦,(花生壳官网另有别的想相识的人可以去相识一些)。并且将这个ip映射成外网,但凡换个网络,ip地址变了,这个也就失效了,别人依旧是连接不上你的服务器,获取不到数据。但是我们可以租一个服务器,百度云服务器阿里云服务器()服务器也就是一个云端的电脑),我们可以将数据库创建在云服务器上就跟创建在我们电脑上是一样的,只不过是换个电脑,服务器他们会给一个稳定的外网ip,直接连接就可以。
4.6.2其他电脑访问我们的mysql

那么如果我们不想使用内网穿透,也租不了服务器。另有一个笨拙的办法就是,在需要用mysql的机器上下载mysql并安装,然后将你使用数据库的代码,hostname设置为localhost,而不是ip地址,然后创表,添加数据,这样在其他电脑运行的时候,它自己的电脑上有一个本地mysql,那么就直接会创建在他的电脑上。但是如果软件是给别人用,肯定不能让人家还下载个别的东西....但这不失为一种方式。
4.6.3sqlite轻量型数据库

如果你的数据不太多,可以使用sqlite,他会产生一个.sqlite文件。发布程序时,将这个sqlite文件,添加到发布目录,它是嵌入式的数据库,跟随程序一起发布,直接能用不需要各种设置那么麻烦,就是能存的数据没有mysql那么大,但也很多...
  1. db = QSqlDatabase::addDatabase("QSQLITE");
  2.     db.setDatabaseName("bmsdatabase.sqlite");
复制代码
先记录这些,等之后遇到的时候再总结,持续更新中...






免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4