记一次编译Qt5的mysql驱动过程

在Qt中默认带有sqlite3的驱动,进行sqlite数据库和qt开发就非常方便,但是毕竟sqlite数据库只是轻量级的。

后来采用mysql数据库,但是Qt 默认没有相应的驱动,一连接数据库就报错      QMYSQL ,  diver not loaded之类的,后来在网上搜了写解决办法,需要手动重新编译Qt连接mysql的静态库,但是按照教程下来没有什么作用。

我用的是Ubuntu16.04  的32位,后来发现在编译的时候是相关静态库文件目录弄错了,按照网上其他人的办法行不通,需要在qmake的时候添加上正确的路径然后执行qmake即可.

说明一下,我安装的mysql版本是5.7,  Qt版本是5.5的,  如果是其他的版本可能有所差别

一开始的时候我找到了Qt的 5.5/gcc/plugins/sqldrivers/libqsqlmysql.so  库文件,以为就是这个库文件的问题,用 ldd   libqsqlmysql.so 发现缺少几个链接库,中间想尽各种办法创建替代链接,但是后来都不行,这种办法后来放弃了。


后来开始手动编译,步骤如下

一、修改.pro文件

找到 qt的响应的源码目录  Src/qtbase/src/plugins/sqldrivers/mysql ,(如果没有Qt下没有Src文件夹,那就是安装qt的时候没有选择安装源码包,需要重新安装的时候注意把全部的组件部分都选上),有几个文件.

然后 vi  mysql.pro 打开文件,添加一行,最后添加后的文件内容如下

TARGET = qsqlmysql


SOURCES = main.cpp
OTHER_FILES += mysql.json
include(../../../sql/drivers/mysql/qsql_mysql.pri)


PLUGIN_CLASS_NAME = QMYSQLDriverPlugin
include(../qsqldriverbase.pri)
INCLUDEPATH += -L/usr/lib/i386-linux-gnu -lmysqlclient_r    #添加的共享库文件路径

注意此处的.pro文件一定要用原来的,不能删掉后,自己执行qmake -project生成,qmake命令生成的.pro文件是不能用的,不能用的,不能用的,重要的事情说三遍

添加的就是 INCLUDEPATH 开头的哪一行, -L  后面的   /usr/lib/i386-linux-gnu   就是libmysqlclient.so的库路径。这句话作用就是引入mysql的那个共享库的路径,而后面的 -l后跟的就是库的文件名,至于为什么是mysqlclient_r  下面会说到。

按照网上的教程 这个库文件是在 /usr/lib 或者 /usr/lib/mysql下  ,但是我发现这两个目录下都没有,我的libsqlclient库文件在 /usr/lib/i386-linux-gnu下。

二、找相关缺失的库文件建立链接


重点来了:


我一开始直接在pro文件里添加的就是 -lmysqlclient 对应那个链接接 libmysqlcliet.so但是,添加完成后qmake,然后make出错

/usr/bin/ld: 找不到 -lmysqlclient_r
/usr/bin/ld: 找不到 -lssl
/usr/bin/ld: 找不到 -lcrypto
collect2: error: ld returned 1 exit status
Makefile:131: recipe for target '../../../../plugins/sqldrivers/libqsqlmysql.so' failed
make: *** [../../../../plugins/sqldrivers/libqsqlmysql.so] Error 1

报错是 另外几个库文件找不到 分别是 mysqlclient_r 和 ssl和  crypto三个库文件 ,对应 libmysqlclient_r.so 和libssl.so 和 libcrypto.so (现在明白为什么是libmysqlclient_r了吧

既然文件找不到那么手动去看一下 ,任然进入   cd    /usr/lib/i386-linux-gnu 下执行下

ls  libmysqlclient_r.so  libssl.so  libcrypto.so 

结果都没有

然后查看是不是有类似的文件

ls -l   libmysqlclient*   libssl*  libcrypto*

发现如下

lrwxrwxrwx 1 root root      19 10月  2 17:38 libcrypto.so.10 -> libhcrypto.so.4.1.0
-rw-r--r-- 1 root root 5199174 7月  20 03:38 libmysqlclient.a
lrwxrwxrwx 1 root root      20 7月  20 03:37 libmysqlclient.so -> libmysqlclient.so.20
lrwxrwxrwx 1 root root      24 7月  20 03:37 libmysqlclient.so.20 -> libmysqlclient.so.20.3.6
-rw-r--r-- 1 root root 4051376 7月  20 03:38 libmysqlclient.so.20.3.6
-rw-r--r-- 1 root root  338704 9月  29 21:47 libssl3.so
lrwxrwxrwx 1 root root      10 10月  2 17:36 libssl.so.10 -> libssl3.so

好了,有文件,那么现在当前文件夹下建立链接,说明下,此处需要sudo

 sudo ln -s libmysqlclient.so.20 libmysqlclient_r.so
 sudo ln -s libssl3.so libssl.so
 sudo ln -s libhcrypto.so.4.1.0 libcrypto.so

完成后回到qt的目录  Src/qtbase/src/plugins/sqldrivers/mysql  下

三、qmake、make以及make  install 生成mysql驱动库文件libqsqlmysql.so

再次执行qmake 

然后执行make

rm -f libqsqlmysql.so
g++ -m32 -L/usr/lib -Wl,--no-undefined -Wl,-O1 -Wl,--enable-new-dtags -Wl,-rpath,/home/zhww/Qt5.5.1/5.5/gcc -Wl,-rpath,/home/zhww/Qt5.5.1/5.5/gcc -Wl,-rpath,/home/zhww/Qt5.5.1/5.5/gcc/lib -shared -o libqsqlmysql.so .obj/main.o .obj/qsql_mysql.o .obj/moc_qsql_mysql_p.o  -rdynamic -L/usr/lib/mysql -lmysqlclient_r -lz -lcrypt -lnsl -lm -lssl -lcrypto -L/home/zhww/Qt5.5.1/5.5/gcc/lib -lQt5Sql -lQt5Core -lpthread  
mv -f libqsqlmysql.so ../../../../plugins/sqldrivers/   


可以看到已经生成了 libqsqlmysql.so

然后执行 make install

install -m 755 -p ../../../../plugins/sqldrivers/libqsqlmysql.so /home/zhww/Qt5.5.1/5.5/gcc/plugins/sqldrivers/libqsqlmysql.so
strip --strip-unneeded /home/zhww/Qt5.5.1/5.5/gcc/plugins/sqldrivers/libqsqlmysql.so
install -m 644 -p /home/zhww/Qt5.5.1/5.5/Src/qtbase/lib/cmake/Qt5Sql/Qt5Sql_QMYSQLDriverPlugin.cmake /home/zhww/Qt5.5.1/5.5/gcc/lib/cmake/Qt5Sql/

完成,测试一下

链接mysq数据库成功!






你可能感兴趣的:(Qt)