You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Fedora 27 64位系统Qt应用QMYSQL驱动未加载问题求助

解决Fedora 27上Qt应用无法加载QMYSQL驱动的问题

我之前在Fedora 27 64位系统上碰到过几乎一模一样的问题,折腾了好一阵才搞定,给你几个针对性的排查和解决步骤:

1. 先确认Qt的MySQL驱动文件及依赖是否正常

首先找到Qt的SQL驱动目录,默认路径一般是/usr/lib64/qt5/plugins/sqldrivers/,进去检查是否存在libqsqlmysql.so文件:

ls /usr/lib64/qt5/plugins/sqldrivers/libqsqlmysql.so

如果文件存在,用ldd命令检查它的依赖库是否有缺失:

ldd /usr/lib64/qt5/plugins/sqldrivers/libqsqlmysql.so

重点看输出里有没有libmysqlclient.solibmariadb.so相关的条目,如果显示not found,那就是依赖缺失导致驱动加载失败。

2. 补全依赖或重新编译Qt的MySQL驱动

情况一:依赖缺失

Fedora 27默认用MariaDB替代MySQL,所以优先安装MariaDB的开发包:

sudo dnf install mariadb-connector-c-devel mariadb-libs

如果你确实用的是官方MySQL,就安装MySQL的开发包:

sudo dnf install mysql-community-devel mysql-community-libs

情况二:驱动本身损坏或不兼容

如果依赖没问题但驱动还是加载失败,就重新编译Qt的MySQL驱动:

  1. 先安装Qt的开发依赖:
sudo dnf install qt5-qtbase-devel qt5-qtbase-private-devel
  1. 进入Qt源码的MySQL驱动目录(如果没源码,先安装qt5-qtbase-src包):
cd /usr/src/qt5/qtbase/src/plugins/sqldrivers/mysql/
  1. 用qmake配置编译参数(根据你用的是MySQL还是MariaDB调整路径):
# MariaDB版本
qmake "INCLUDEPATH=/usr/include/mariadb" "LIBS=-L/usr/lib64/mariadb -lmariadb"

# MySQL版本
qmake "INCLUDEPATH=/usr/include/mysql" "LIBS=-L/usr/lib64/mysql -lmysqlclient"
  1. 编译并安装:
make && sudo make install

3. 检查环境变量是否正确配置

确保Qt能找到插件目录,MySQL库能被系统加载:

# 临时设置,仅当前终端有效
export QT_PLUGIN_PATH=/usr/lib64/qt5/plugins/
export LD_LIBRARY_PATH=/usr/lib64/mysql:/usr/lib64/mariadb:$LD_LIBRARY_PATH

如果要永久生效,把这两行加到~/.bashrc~/.zshrc里,然后重新登录终端。

4. 用测试程序验证驱动

写个极简的Qt程序测试连接,能得到更详细的错误信息:

#include <QCoreApplication>
#include <QSqlDatabase>
#include <QDebug>

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);
    
    qDebug() << "Available drivers:" << QSqlDatabase::drivers();
    
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("localhost");
    db.setDatabaseName("你的数据库名");
    db.setUserName("你的用户名");
    db.setPassword("你的密码");
    
    if (db.open()) {
        qDebug() << "数据库连接成功!";
        db.close();
    } else {
        qDebug() << "连接失败:" << db.lastError().text();
    }
    
    return a.exec();
}

编译运行后,根据输出的具体错误再针对性调整。

内容的提问来源于stack exchange,提问作者TSG

火山引擎 最新活动