Create driver QMYSQL for Qt on Mac

摘要:

解决在mac环境下Qt无法连接到mysql数据库的问题

最近尝试在mac环境下将Qt连接到mysql,但是Qt本身是没有预装mysql的驱动的,所以需要用户手动根据Qt源码将这个驱动编译出来,这个过程中遇到了很多的问题,网上的方法对于我的情况大多数都不管用。经过将近9个小时的尝试总算是成功连上mysql了,将这个过程记录一下,希望能给同样遇到这个问题的朋友一些帮助。

  1. 首先说下我的环境和软件版本

    MacOs: Catalina 10.15.4

    Qt: 5.13.2

    Mysql: 8.0.20

  2. 当我们在Qt中尝试连接数据库时,会写这样的代码:

    1
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");

    但是由于QMYSQL不存在,所以Qt会报错:

    QSqlDatabase: QMYSQL driver not loaded
    QSqlDatabase: available drivers: QSQLITE QODBC QODBC3 QPSQL QPSQL7

  3. 为了解决这个问题,接下来我们会按照一篇官方文档来进行操作,但是在此之前,有一点非常重要,那就是在安装Qt时,除了名字上带有IOS、Android的那几个肯定不会用的组件之外,尽量将所有的组件全都安装,不然你将找不到接下来要用到的路径以及接下来要用到的文件(我因为这个真的是耽误了超久的时间)。在这里附上Qt的下载地址

  4. 接下来,按照上面提到的官方文档的指示,需要做这些

    1
    2
    3
    cd $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
  5. 接着,我们进入到当前目录下的myql文件夹中将mysql的驱动编译出来

    1
    2
    3
    cd mysql
    qmake
    make install

    注意,这里的qmake也要注意版本是否正确,如果不正确,就按照第4点的方法解决。

    这一步执行完之后,我们就可以在$QTDIR/clang_64/plugins/sqldriver路径下找到libqsqlmysql_debug.dylib、libqsqlmysql_debug.dylib.dSYM、libqsqlmysql.dylib、libqsqlmysql.dylib.dSYM这四个文件,这些就是我们连接mysql的关键

  6. 虽然现在我们已经有了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所在的文件夹的路径。

  7. 至此,如果前面的步骤都没有问题的话,应该就已经可以连接到mysql了。