目录
简介
Qt与MYSQL的驱动需要根据自己的Qt版本进行编译,否则不会加载成功。所以需要在安装Qt时,一定要选择source,安装Qt源码,才能进行QT+MYSQL驱动的编译。另外,arm下的Qt+MYSQL驱动稍有不同,谨以此文,总结相关的经验。本文中使用的软件版本如下,分别讲述x86与arm下的Qt+MYSQL驱动支持过程。
需要说明的是,系统安装了arm_qt交叉编译环境,详细教程见:https://blog.csdn.net/qq_39302310/article/details/123997722
所以详细的软件版本配置如下表:
软件版本 | 参数值 |
---|---|
Qt版本 | 5.9.9 (qt-opensource-linux-x64-5.9.9和qt-everywhere-src-5.9.9) |
MYSQL版本 | 5.7.33(x86)、mysql-connector-c-6.0.2(ARM) |
1.测试代码准备
#include <QPluginLoader>
#include <QSqlError>
#include <QSqlDatabase>
#include <QDebug>
#include <QCoreApplication>
void loadMySqlDriver();
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
/*
*链接mysql数据库
*/
QSqlDatabase db( QSqlDatabase::addDatabase( "QMYSQL" ) );
db.setHostName("127.0.0.1");
db.setDatabaseName("contect_test");
db.setUserName("root");
db.setPassword("root");
db.setPort(3360);
if(!db.open())/*测试数据库是否链接成功*/
{
qDebug()<<db.lastError()<<endl;
}
else
{
qDebug()<<"Ok"<<endl;
}
return a.exec();
}
测试代码如上,此时应该是连接不上的,在编译阶段就会报错。
若此时编译,则控制台就会输出如下错误信息:
QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL QMYSQL3 QODBC
Qt虽然支持直接连接MySQL,但是并没有将插件直接编译好,是因为MySQL版本不一样,编译出来的插件也不一样,这就是为什么CSDN下载的驱动是不可以用的原因。
2. Qt在x86架构下的MYSQL驱动编译
2.1 安装依赖
sudo apt-get install openssl
sudo apt-get install libssl-dev
2.2 修改mysql.pro文件
该文件在qt安装目录下,src中,别找错了,qt源码目录有几个src,在我的ubuntu上,是这个路径:
software/qt/5.9.9/Src/qtbase/src/plugins/sqldrivers/mysql
打开pro文件,将QMAKE_USE注释掉:
TARGET = qsqlmysql
HEADERS += $$PWD/qsql_mysql_p.h
SOURCES += $$PWD/qsql_mysql.cpp $$PWD/main.cpp
#QMAKE_USE += mysql
OTHER_FILES += mysql.json
PLUGIN_CLASS_NAME = QMYSQLDriverPlugin
include(../qsqldriverbase.pri)
2.3 修改qsqldriverbase.pri文件
返回到上层目录
找到qsqldriverbase.pri文件,打开并将以下行注释掉:
include($$shadowed($$PWD)/qtsqldrivers-config.pri)
添加如下行:
include($$shadowed($$PWD)/configure.pri)
pri文件修改后的效果如下:
QT = core core-private sql-private
# For QMAKE_USE in the parent projects.
#include($$shadowed($$PWD)/qtsqldrivers-config.pri)
include($$shadowed($$PWD)/configure.pri)
PLUGIN_TYPE = sqldrivers
load(qt_plugin)
DEFINES += QT_NO_CAST_TO_ASCII QT_NO_CAST_FROM_ASCII
2.4 qmake编译
/qt安装目录/5.9.9/gcc_64/bin/qmake "INCLUDEPATH+=/usr/include/mysql" "LIBS+=-L/usr/lib/x86_64-linux-gnu/ -lmysqlclient" mysql.pro
qmake生成Makefile文件后,执行如下命令:
sudo make
2.5 库文件拷贝
在/Qt安装目录software/qt/5.13.2/src/qtbase/src/plugins/sqldrivers/plugins/sqldrivers/ 目录下会出现libqsqlmysql.so.debug和 libqsqlmysql.so两个文件,把它们拷贝到/gcc_64/plugins/sqldrivers覆盖原文件。根据实际测试,我这边只生成了一个libqsqlmysql.so文件,不过不影响使用。
此时,再次运行刚才的测试代码,你就会发现程序输出了OK。这样则代表程序在Qt开发环境下正常的连接了MYSQL数据库。
2.6 x86下打包后仍旧连接不上mysql数据库的问题解决
打包后,发现依旧不能连接数据库,提示如下缺少驱动错误:
2.6.1 问题追踪及解决
思考涉及数据库的驱动只有几个文件:
- libqsqlmysql.so
- libmysqlclient.so.20
分别利用ldd命令进行链接追踪:
ldd libmysqlclient.so.20
ldd libqsqlmysql.so
得到如下结果:
发现缺少libstdc++.so.6
【解决方案】可以从开发机器直接全局搜索libstdc++.so.6,并查看链接libstdc++.so.6.0.21,将这两个文件拷贝到打包后的lib目录下,可解决此问题!
继续执行发现如下
发现缺少libc.so.6,这个库文件如果要是像libstdc++.so.6一样直接从机器拷贝的话,可能会提示版本不匹配:
错误信息:relocation error: libc.so.6: symbol _dl_find_dso_for_object, version GLIBC_PRIVATE not defined
解决问题见参考博客文章,此处贴出处理办法:
在目标主机上,执行如下安装glibc步骤:
curl -O http://ftp.gnu.org/gnu/glibc/glibc-2.18.tar.gz
tar zxf glibc-2.18.tar.gz
cd glibc-2.18/
mkdir build
cd build/
../configure --prefix=/usr
make -j2
make install
glibc-2.18.tar.gz的下载也可以通过本文链接进行下载:glibc-2.18.tar.gz
按照以上步骤安装完成后即可解决。
2.6.2 其他依赖拷贝
保险起见,将如下库文件也通过搜索开发主机,拷贝至目标主机的软件打包lib目录下:
libQt5Core.so.5 libQt5Sql.so.5 libstdc++.so.6
libQt5Core.so.5.9.9 libQt5Sql.so.5.9 libstdc++.so.6.0.21
libQt5Core.so libQt5Sql.so libQt5Sql.so.5.9.9
本文总结了相关库文件,详细可见:qt_x86_mysql打包常缺少的库
3. Qt在arm架构下的MYSQL驱动支持
3.1 arm架构下程序的打包
详细的过程参考我的另一篇文章:
Qt工程打包,针对Windows(X86)、Linux平台(X86和ARM架构)步骤全解
3.2 打包过程中缺少库文件的错误解决
3.2.1 arm架构下程序打包缺少库文件错误
因为我的测试程序中,使用了MYSQL数据库,所以如果按照上述打包过程直接打包的话,在arm主机上运行会出现以下错误:
详细的错误信息也贴出来:
error while loading shared libraries: libQt5Sql.so.5: cannot ope n shared object file: No such file or directory
首先,猜测是否在arm下需要编译一个MYSQL驱动,但是寻找了一些教程,没有得到明确的答案。
于是,还是从控制台的错误输出分析,发现这个错误是由于缺少libQt5Sql.so.5造成的,而libQt5Sql.so.5这样的命名方式多半是个链接而已。于是,得到下文的解决方案。
3.2.2 缺少库文件错误的解决方案
由于我安装了交叉编译环境,其目录结构如下:
打开文件路径,直接搜索“libQt5Sql”
得到如下结果
利用file命令查看:
file libQt5Sql.so.5
发现该文件是一个链接文件,继续file命令查看链接的源文件:
file libQt5Sql.so.5.9.9
发现该文件正是arm架构下的库。于是将这两个库拷贝到打包的lib文件夹中:
再次执行程序,发现可以正确运行!但是发现连接MYSQL数据库失败,提示缺少驱动。
因而更新了如下章节。
3.3 arm架构下Qt+MYSQL驱动交叉编译
查阅了大量资料,发现需要编译交叉编译ARM架构下的MYSQL与QT的驱动,由于我安装了交叉编译环境,交叉编译的qmake其目录如下:
/home/root/qt5.9.9/qt5.9.9-arch64/bin/qmake
另外,还安装了ARM下的gcc和g++交叉编译,上述环境配置和搭建步骤见如下博文:
https://blog.csdn.net/qq_39302310/article/details/123997722
接下来将阐述具体的交叉编译过程。
3.3.1 交叉编译MYSQL
3.3.1.1 从mysql官网下载mysql-client源码
mysql官方 源码下载连接:
ftp://ftp.fu-berlin.de/unix/databases/mysql/Downloads/Connector-C/
下载时,注意选择mysql-connector-c-6.0.2.tar.gz文件,否则与本教程不匹配。
3.3.1.2 交叉编译mysql-client源码
解压源码并cd到mysql-connector-c-6.0.2源码目录下,执行下面命令
cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=/home/mysql/target/
其中/home/mysql/target/为编译输出文件路径,自行创建一个就行,但实际测试安装时不会安装到此目录。然后再在mysql-connector-c-6.0.2目录下,编辑CMakeLists.txt添加下面两行,并设置为本机已安装的交叉编译的gcc和g++名称
SET(CMAKE_C_COMPILER "aarch64-linux-gnu-gcc")
SET(CMAKE_CXX_COMPILER "aarch64-linux-gnu-g++")
3.3.1.3 执行make和make install进行MYSQL源码编译安装
make
make install
执行结果如下:
Install the project...
-- Install configuration: "Release"
-- Installing: /usr/local/mysql/include
-- Installing: /usr/local/mysql/include/mysqld_error.h
-- Installing: /usr/local/mysql/include/wqueue.h
***省略内容***
-- Installing: /usr/local/mysql/include/my_config.h
-- Installing: /usr/local/mysql/include/myisampack.h
-- Installing: /usr/local/mysql/./README
-- Installing: /usr/local/mysql/./COPYING
-- Installing: /usr/local/mysql/./EXCEPTIONS-CLIENT
-- Installing: /usr/local/mysql/lib/libmysql.so.16.0.0
-- Installing: /usr/local/mysql/lib/libmysql.so.16
-- Installing: /usr/local/mysql/lib/libmysql.so
-- Installing: /usr/local/mysql/lib/libmysqlclient.a
-- Installing: /usr/local/mysql/lib/libmysqlclient.so
-- Installing: /usr/local/mysql/lib/libmysqlclient_r.so
-- Installing: /usr/local/mysql/bin/mysql_config
上述执行结果中,/usr/local/mysql/lib/和/usr/local/mysql/include就是我们想要的交叉编译后的MYSQL路径。
3.3.2 交叉编译libmysqlclient.so
下面根据上面编译出的mysqlclient编译mysql驱动,编译过程中需要对qt的源码进行修改,具体过程与前文X86下的修改类似,下面将具体阐述。
3.3.2.1 Qt的mysql驱动源码修改
下载qt-everywhere-opensource-src-5.9.9.tar.xz(注意:必须下载与自己qt版本对应,我这边X86下是5.9.9版本,所以对应下载的也是5.9.9的everywhere版本),官方下载地址:
qt-everywhere-opensource-src-5.9.9.tar.xz
解压后进入如下目录:
cd /home/root/Desktop/arm/qt-everywhere-opensource-src-5.9.9/qtbase/src/plugins/sqldrivers/mysql
(1)需要修改/qt-everywhere-opensource-src-4.8.4/src/plugins/sqldrivers/mysql/mysql.pro文件中的路径如下:
#注释下面这一行
#QMAKE_USE += mysql
#该路径是mysql的头文件路径
INCLUDEPATH +="/usr/local/mysql/include/"
#这是交叉编译后的MySQL的库文件路径,一定要注意是client
LIBS +=-L/usr/local/mysql/lib -lmysqlclient_r
#为了方便查找,不妨增加一条语句,该语句用来指明编译后的结果输出的位置
#DESTDIR = /home/root/Desktop/arm/mysql-5.7.27-aarch64/
(2)修改上一层文件夹中的qsqldriverbase.pri文件
QT = core core-private sql-private
# For QMAKE_USE in the parent projects.
#注释下面这一行
#include($$shadowed($$PWD)/qtsqldrivers-config.pri)
#新增
include($$shadowed($$PWD)/configure.pri)
PLUGIN_TYPE = sqldrivers
load(qt_plugin)
DEFINES += QT_NO_CAST_TO_ASCII QT_NO_CAST_FROM_ASCII
3.3.2.2 交叉编译Qt的mysql驱动源码
(1)在mysql.pro的路径下执行qmake,注意,qmake是交叉编译的版本:
cd /home/root/Desktop/arm/qt-everywhere-opensource-src-5.9.9/qtbase/src/plugins/sqldrivers/mysql
/home/wangcx/qt5.9.9/qt5.9.9-arch64/bin/qmake
(2)make和make install
make
make install
执行make结束之后会有如下输出,最后一行显示成功生成libqsqlmysql.so
#...省略内容...
/opt/aarch64-linux-gnu/bin/aarch64-linux-gnu-g++ -Wl,--no-undefined -Wl,-O1 -fuse-ld=gold -Wl,--enable-new-dtags -Wl,-z,origin -Wl,-rpath,\$ORIGIN/../../lib -shared -o libqsqlmysql.so .obj/qsql_mysql.o .obj/main.o .obj/moc_qsql_mysql_p.o -L/usr/local/mysql/lib -lmysqlclient_r -L/home/wangcx/qt5.9.9/qt5.9.9-arch64/lib -lQt5Sql -lQt5Core -lpthread
mv -f libqsqlmysql.so ../plugins/sqldrivers/libqsqlmysql.so
按照ARM打包教程(Qt在x86和arm下的打包)打包时,把编译好的ARM架构的libqsqlmysql.so文件放入打包lib目录,若出现如下问题,请继续查看下一节问题解决。
3.3.2.3 测试libmysqlclient.so动态库加载情况
使用如下命令:
ldd libqsqlmysql.so
发现缺少相关的动态库,所以导致arm下MYSQL驱动仍旧提示未加载。
于是,在ARM交叉编译的mysql目录/usr/local/mysql/lib下搜索,得到如下结果
所以需要一齐打包如lib目录下的库不止libqsqlmysql.so,还需要将这些文件都打包进去。下面是整理的文件列表:
ld-2.25.so libm.so.6 libQt5Core.so.5.9.9
ld-linux-aarch64.so.1 libmysqlclient_r.so libQt5Network.so.5
ld-linux-x86-64.so.2 libmysqlclient.so libQt5Network.so.5.9
libc.so.6 libmysql.so libQt5Network.so.5.9.9
libdl.so.2 libmysql.so.16 libQt5Sql.so.5
libgcc_s.so.1 libmysql.so.16.0.0 libQt5Sql.so.5.9.9
libglib-2.0.so.0 libpcre.so.3 libstdc++.so.6
libgthread-2.0.so.0 libpthread.so.0 libstdc++.so.6.0.24
libicudata.so.56 libqsqlmysql.so libz.so.1
libicui18n.so.56 libQt5Core.so.5
libicuuc.so.56 libQt5Core.so.5.9
相关驱动库文件资源已上传,传送门:Arm架构下Qt5.9.9与MYSQL 5.7.33的驱动so文件
所有的测试代码及MYSQL源码等文件也已上传,详见:本文涉及资源整合
4. 参考链接
https://blog.csdn.net/qq_42956179/article/details/107285977
https://blog.csdn.net/wumeng1995/article/details/105734440
https://blog.csdn.net/weixin_33973572/article/details/113313051
https://blog.csdn.net/jiacheng1991/article/details/82597922