Qt中Mac编译MySQL驱动

准备工作

  1. mysql安装包
  2. Qt安装时选择了Source

编译过程

  1. 下载并解压MySQL安装包。
  2. 修改mysql.pro文件(Qt/5.12.10/Src/qtbase/src/plugins/sqldrivers/mysql/mysql.pro)。
   TARGET = qsqlmysql
   
   HEADERS += $$PWD/qsql_mysql_p.h
   SOURCES += $$PWD/qsql_mysql.cpp $$PWD/main.cpp
   
   #QMAKE_USE += mysql    ## 这个位置注释掉
   
  # 添加下面一个依赖与一个库
  INCLUDEPATH+=/Users/rey/.sbin/mysql-8.0.26-macos11-x86_64/include
  LIBS += -L//Users/rey/.sbin/mysql-8.0.26-macos11-x86_64/lib -lmysqlclient
 
 OTHER_FILES += mysql.json
  
  PLUGIN_CLASS_NAME = QMYSQLDriverPlugin
  include(../qsqldriverbase.pri)

在编译的过程中可能会报错提示找不到qtsqldrivers-config.pri;
直接将qsqldriverbase.pri复制一份名称为 qtsqldrivers-config.pri即可。

编译: qmake ./mysql.pro

添加驱动

make && make install 会自动添加驱动到编译器的sqldrivers目录中。
找到新编译的驱动,使用
otool -L libmysqlclient.dylib 检测一下依赖

正常会找不到库。@rpath/libmysqlclient.21.dylib

将mysql 安装包中的这个文件创建一个软连接放到 clang_x64/lib/目录即可。

sudo ln -s /mysql/lib/libmysqlclient.dylib xxxx/clang_64/lib/libmysqlclient.21.dylib


2022-3-6更新

最近安装Mac更新后,突然不能连接MySQL数据库了,提示QMysql drive not load

解决过程:
使用 otool -L libqsqlmysql.dylib查询这个驱动的依赖是不是完整的,结果出现了个我不知道的 @rpath
查询结果 :

libqsqlmysql.dylib (compatibility version 0.0.0, current version 0.0.0)
	@rpath/libmysqlclient.21.dylib (compatibility version 21.0.0, current version 21.0.0)
	@rpath/QtSql.framework/Versions/5/QtSql (compatibility version 5.15.0, current version 5.15.2)
	@rpath/QtCore.framework/Versions/5/QtCore (compatibility version 5.15.0, current version 5.15.2)
	/System/Library/Frameworks/DiskArbitration.framework/Versions/A/DiskArbitration (compatibility version 1.0.0, current version 1.0.0)
	/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit (compatibility version 1.0.0, current version 275.0.0)
	/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 904.4.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1292.60.1)

这个 @rpath是什么鬼?看来问题就出在这个地方了。于是乎,网上冲浪解决问题:install_name_tool -add_rpath xxxx/mysql-8.0.27/lib xxxx/libmysqlclient.21.dylib 第一个xxx表示msyql中库所在的位置,第二个xxx表示驱动所在的位置。问题解决。

posted @ 2021-10-25 21:58  看不见的R  阅读(343)  评论(0编辑  收藏  举报