在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 发现缺少几个链接库,中间想尽各种办法创建替代链接,但是后来都不行,这种办法后来放弃了。
后来开始手动编译,步骤如下
找到 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
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数据库成功!