Qt编译MySQL驱动

Qt编译MySQL驱动

参考:qt6.5.0MySQL驱动手动编译以及数据库连接详细教程以及注意事项附资源链接_qt编译mysql驱动-CSDN博客

由于MySQL等数据库的client库遵循的协议与GPL不兼容,因此Qt发布时不带有这些驱动,需要自行编译。

在Qt5版本的编译由于使用傻瓜式的qmake,要简单很多:QT出现没有MySQL驱动,手动编译步骤 - nanmi - 博客园 (cnblogs.com)

本文讲解Qt6使用cmake编译的步骤。

下载Qt源码

下载Qt对应版本的源码,注意Qt安装时才能安装对应版本的源码,之后再通过QMaintenance Tool就没有对应版本的源码选项了。

但实测拿相近的低版本源码应急一下还是可以的。

找到数据库驱动部分的源码

找到数据库驱动部分的源码,为了避免污染源码目录,可以将这个 sqldrivers 文件夹复制到其他目录。

注意 sqldrivers 文件夹才是数据库驱动部分的项目根目录,不信可以编译试试,会发现找不到一些Qt自定义的CMake函数。

image

安装MySQL

安装MySQL后,在安装路径下找到头文件和库文件:

image

拷贝这两个文件夹到某个路径不含空格和中文的地方,比如我拷贝到了 sqldrivers/mysql 下。

配置CMake

这部分我是怎么知道怎么配置的?就是看项目中的CMakeLists.txt,很容易看懂。

可以用QtCreator打开 sqldrivers 工程,配置三个环境变量,可以在 .cmake.conf 中写(因为这个文件会被顶层 CMakeLists.txt 引入):

image

然后尝试编译,我这里选的是Release,毕竟谁会去调试库:

image

即可在生成目录得到驱动的库文件:

(1)查看构建目录位置:

image

image

(2)将生成的库文件拷贝 Qt 插件目录:

image

如果用的是 PySide6,则同理需要拷贝到 PySide6 插件目录:

image

(3)将 MySQL client驱动库文件拷贝到 Qt 编译工具链根目录,这样以后直接就能用而无需指定库文件路径。否则会出现“Driver not loaded”错误:

image

如果用的是 PySide6,则同理需要拷贝到 PySide6 目录:

image

测试功能

新建一个 Qt 项目(控制台项目就行)

CMakeLists.txt 中添加依赖:

find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core Sql)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Sql)

target_link_libraries(mysql_test
    Qt${QT_VERSION_MAJOR}::Core
    Qt${QT_VERSION_MAJOR}::Sql
)

输入代码测试:

#include <QDebug>
#include <QSqlDatabase>
#include <QSqlError>

int main(int argc, char *argv[])
{
    qDebug() << QSqlDatabase::drivers();
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("127.0.0.1");
    db.setDatabaseName("harbor");
    db.setUserName("root");
    db.setPassword("mysql123");
    db.setPort(3306);

    bool ok = db.open();
    if(ok) qInfo() << "OK";
    else qFatal() << "Error: " << db.lastError().text();
}
/*
QList("QSQLITE", "QMIMER", "QMARIADB", "QMYSQL", "QODBC", "QPSQL")
OK
*/

常见错误

找不到Qt

如果报错说找不到Qt,则需要按照提示设置一下变量:

Could not find a package configuration file provided by "QT" with any of the following names: Qt6Config.cmake qt6-config.cmake Qt5Config.cmake qt5-config.cmake Add the installation prefix of "QT" to CMAKE_PREFIX_PATH or set "QT_DIR" to a directory containing one of the above files.  If "QT" provides a separate development package or SDK, be sure it has been installed.

即在顶层 CMakeLists.txt 中设置 Qt 编译工具链路径:

image

再次尝试编译,应该就可以了。

路径错误

观察编译输出信息,可以看到错误原因是路径不能有空格和中文:

image

但是我们前面已经设置了一个不含空格和中文的路径啊?

这就要再去看看CMakeLists.txt:

项目顶层 CMakeLists.txt 中要求的是 QT_FEATURE_sql_mysql ,没写错啊:

image

但是查看 CMakeCache.txt,可以看到问题出在 Qt 编译工具链使用了 MySQL_INCLUDE_PATH ,这个变量是哪来的?

image

查看 QtCreator 自带设置的 CMake 变量,可以看到还设置了一个 MySQL_LIBRARY_DEBUG, 使用的路径是系统中 MySQL 的安装路径:

image

之前我不小心将前面设置在 .cmake.conf 中的环境变量设置为 MYSQL_INCLUDE_DIR ,打错了,导致使用的 QtCreator 设置的环境变量。

修正即可,记得删除 CMakeCache.txt 再重新编译。

posted @ 2024-04-11 19:21  3的4次方  阅读(214)  评论(0编辑  收藏  举报