Qt在x86与arm下缺少MYSQL驱动的解决方案

6 篇文章 0 订阅
4 篇文章 0 订阅

简介

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驯龙高手_追风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值