查阅了网上的说法,出现这个错误的原因大致可能有以下几种:
- Qt和mysql的位数不一样,一个是32位的,一个是64位的
- Qt中自带的驱动库与所使用的版本不匹配
- 代码写错了,比如"QMYSQL"写成了"MYSQL"
我出现个问题的原因是第二种。参考了一位老哥的博客QT Mac M1 解决 mysql driver not loaded 问题、官方文档重新编译生成。具体解决过程如下:
准备编译工具
需要提前安装好cmake和ninja,一般安装qt的时候都会一起安装了。
如果没有安装:
- arch的小伙伴可以直接通过
sudo pacman -S cmake ninja
安装 - 也可以自己通过源码构建或者下载已经构建好的二进制文件。具体参考包的官网
确认安装目录所在位置
因为我看网上有人是有下载目录和安装目录两个,防止为了搞混,还是说一下安装目录的位置
一般linux用户使用Qt自带的线上下载工具呢,安装在用户目录,也就是/home/<username>
,自己选择选择位置的那就得问你自己了哦
若是使用linux发行版维护的qt呢,就可以去查看相应文档,查看文件的安装位置(arch就是安装在/usr下,对应的文件也在/usr的各个子目录中)
若是找到有点名字是qt,但是又不知道是不是安装目录的,看下图,只要是下图的组织结构的就是:
检测可用的客户端
先进入到Src目录:cd <Qt安装目录>/<版本号>/Src
,例如我的就是~/Qt/6.5.2/Src
。
执行configure
脚本,这个脚本会自动检测电脑上可用的客户端,中间会出现类似如下的输出:
...
Database options:
-sql-<driver> ........ Enable SQL <driver> plugin. Supported drivers:
db2 ibase mysql oci odbc psql sqlite
[all auto]
-sqlite .............. Select used sqlite [system/qt]
...
发现有自己要使用的客户端后进行下一步
检测必要的库和头文件
同样还是使用configure
脚本来检测,但是还需要传入一些参数,来指定mysql/mariadb的头文件目录,以及库目录。
./configure -sql-mysql -- -DCMAKE_INCLUDE_PATH="<Mysql的include文件夹位置>" -DCMAKE_LIBRARY_PATH="<Mysql的lib库目录>"
,
例如我的是:
./configure -sql-mysql -- -DCMAKE_INCLUDE_PATH="/usr/include/mysql" -DCMAKE_LIBRARY_PATH="/usr/lib/mysql"
如果有报错,那就按照报错的提示去做,例如脚本告诉我我缺少LLVM,让我用LLVM_DIR
参数指定其库目录,则就是:
./configure -sql-mysql -- -DCMAKE_INCLUDE_PATH="/usr/include/mysql" -DCMAKE_LIBRARY_PATH="/usr/lib/mysql" -DLLVM_DIR="usr/lib/cmake/llvm"
运行成功后差不多显示如下信息:
-- Configuring done
-- Generating done
-- Build files have been written to: ~/Qt/6.5.2/Src
编译插件
- 先进入到sql插件目录(规范一点):
cd ~/Qt/6.5.2/gcc_64/plugins/sqldrivers
- 创建并进入build目录:
mkdir build && cd build
- 使用qt的qt-cmake进行Cmake配置:
~/Qt/6.5.2/gcc_64/bin/qt-cmake -G Ninja ~/Qt/6.5.2/Src/qtbase/src/plugins/sqldrivers -DCMAKE_INSTALL_PREFIX="~/Qt/6.5.2/gcc_64" -DMySQL_INCLUDE_DIR="/usr/include/mysql" -DMySQL_LIBRARY="/usr/lib/libmariadb.so"
没有什么问题的话,进行编译 cmake --build . --config Release
没有什么问题的话就接着进行安装:cmake --install .
将生成的动态库文件放到Sql驱动目录
在build目录下执行:cp build/plugin/sqldrivers/libqsqlmysql.so ./
最后重启Qt Creator再运行即可
若是想查看类似的运行效果的图片,可以去开头给出的两个链接里面去看。可以结合那两篇一起看。