摘要:
解决在mac环境下Qt无法连接到mysql数据库的问题
最近尝试在mac环境下将Qt连接到mysql,但是Qt本身是没有预装mysql的驱动的,所以需要用户手动根据Qt源码将这个驱动编译出来,这个过程中遇到了很多的问题,网上的方法对于我的情况大多数都不管用。经过将近9个小时的尝试总算是成功连上mysql了,将这个过程记录一下,希望能给同样遇到这个问题的朋友一些帮助。
首先说下我的环境和软件版本
MacOs: Catalina 10.15.4
Qt: 5.13.2
Mysql: 8.0.20
当我们在Qt中尝试连接数据库时,会写这样的代码:
1
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
但是由于QMYSQL不存在,所以Qt会报错:
QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QODBC QODBC3 QPSQL QPSQL7为了解决这个问题,接下来我们会按照一篇官方文档来进行操作,但是在此之前,有一点非常重要,那就是在安装Qt时,除了名字上带有IOS、Android的那几个肯定不会用的组件之外,尽量将所有的组件全都安装,不然你将找不到接下来要用到的路径以及接下来要用到的文件(我因为这个真的是耽误了超久的时间)。在这里附上Qt的下载地址。
接下来,按照上面提到的官方文档的指示,需要做这些
1
2
3cd $QTDIR/Src/qtbase/src/plugins/sqldrivers
qmake -- MYSQL_PREFIX=/usr/local/mysql
make sub-mysql有一点需要注意,在执行make sub-mysql的时候,有可能会报错,这可能是因为qmake的版本不对,所以这时候可以执行qmake -version来检查一下qmake的版本,当时我检查后发现qmake默认使用的是conda环境下的qmake,自然就会出问题,而我们希望使用的是/Users/zhangyazhe/Qt5.13.2/5.13.2/clang_64/bin/qmake,所以需要将上面的qmake命令改为
1
/Users/zhangyazhe/Qt5.13.2/5.13.2/clang_64/bin/qmake -- MYSQL_PREFIX=/usr/local/mysql
接着,我们进入到当前目录下的myql文件夹中将mysql的驱动编译出来
1
2
3cd mysql
qmake
make install注意,这里的qmake也要注意版本是否正确,如果不正确,就按照第4点的方法解决。
这一步执行完之后,我们就可以在$QTDIR/clang_64/plugins/sqldriver路径下找到libqsqlmysql_debug.dylib、libqsqlmysql_debug.dylib.dSYM、libqsqlmysql.dylib、libqsqlmysql.dylib.dSYM这四个文件,这些就是我们连接mysql的关键
虽然现在我们已经有了libqsqlmysql.dylib,但是这个时候如果去Qt里尝试连接mysql,会得到错误信息说QMYSQL已经可以用了,但是无法被加载。在我遇到的情况中,这是因为这个动态链接库所依赖的那些库有些无法被找到。我们可以使用otool命令来查看libqsqlmysql.dylib所依赖的库
1
otool -L /Users/zhangyazhe/Qt5.13.2/5.13.2/clang_64/plugins/sqldrivers/libqsqlmysql.dylib
执行后可以看到很多路径前面都有@rpath这个标记,经过尝试我发现是因为由于@rpath中没有包含正确的路径导致@rpath/libmysqlclient.21.dylib无法被找到,所以我们需要手动将libmysqlclient.21.dylib所在的文件夹的路径加入到@rpath中,使用install-name-tool命令
1
install_name_tool -add_rpath /usr/local/mysql-8.0.20-macos10.15-x86_64/lib /Users/zhangyazhe/Qt5.13.2/5.13.2/clang_64/plugins/sqldrivers/libqsqlmysql.dylib
-add_rpath后面的第一个参数就是libmysqlclient.21.dylib所在的文件夹的路径。
至此,如果前面的步骤都没有问题的话,应该就已经可以连接到mysql了。