Qmysql 驱动程序未加载,但它可用

Qmysql driver not loaded but it's available

本文关键字:驱动程序 加载 Qmysql      更新时间:2023-10-16

我想连接我的数据库(mysql)与ubuntu 16.04 Qt库。
但是我遇到了这个错误:

QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL3 QPSQL QPSQL7

ldd /Qt-PATH/Qt5.7.0/5.7/gcc_64/plugins/sqldrivers/libqsqlmysql.so的结果为:

linux-vdso.so.1 =>  (0x00007fff9d55a000)
    libmysqlclient_r.so.16 => not found
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007efc887eb000)
    libcrypt.so.1 => /lib/x86_64-linux-gnu/libcrypt.so.1 (0x00007efc885b3000)
    libnsl.so.1 => /lib/x86_64-linux-gnu/libnsl.so.1 (0x00007efc8839a000)
    libssl.so.10 => not found
    libcrypto.so.10 => not found
    libQt5Sql.so.5 => /home/hassan-setayesh/ProgramFiles/Qt5.7.0/5.7/gcc_64/plugins/sqldrivers/./../../lib/libQt5Sql.so.5 (0x00007efc88154000)
    libQt5Core.so.5 => /home/hassan-setayesh/ProgramFiles/Qt5.7.0/5.7/gcc_64/plugins/sqldrivers/./../../lib/libQt5Core.so.5 (0x00007efc87a38000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007efc8781b000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007efc87499000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007efc8718f000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007efc86f79000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007efc86bb0000)
    libicui18n.so.56 => /home/hassan-setayesh/ProgramFiles/Qt5.7.0/5.7/gcc_64/plugins/sqldrivers/./../../lib/libicui18n.so.56 (0x00007efc86715000)
    libicuuc.so.56 => /home/hassan-setayesh/ProgramFiles/Qt5.7.0/5.7/gcc_64/plugins/sqldrivers/./../../lib/libicuuc.so.56 (0x00007efc8635d000)
    libicudata.so.56 => /home/hassan-setayesh/ProgramFiles/Qt5.7.0/5.7/gcc_64/plugins/sqldrivers/./../../lib/libicudata.so.56 (0x00007efc8497a000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007efc84775000)
    libgthread-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgthread-2.0.so.0 (0x00007efc84573000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007efc8436b000)
    libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007efc84059000)
    /lib64/ld-linux-x86-64.so.2 (0x0000564692881000)
    libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007efc83de9000)

解这个题:libmysqlclient_r.so.16 => not found我用这些命令将它链接到libmysqlclient.so.20.3.2:
cd /usr/lib/x86_64-linux-gnu/sudo ln -s libmysqlclient.so.20.3.2 libmysqlclient_r.so.16

我的Qt版本是5.7离线模式。

我该怎么办?

重复10次:

  1. 我永远不会使用符号链接来解决由于不同的sonname而丢失的库问题
  2. 我永远不会使用符号链接来解决由于不同的sonname而丢失的库问题
  3. 我永远不会使用符号链接来解决由于不同的sonname而丢失的库问题
  4. 我永远不会使用符号链接来解决由于不同的sonname而丢失的库问题
  5. 我永远不会使用符号链接来解决由于不同的sonname而丢失的库问题
  6. 我永远不会使用符号链接来解决由于不同的sonname而丢失的库问题
  7. 我永远不会使用符号链接来解决由于不同的sonname而丢失的库问题
  8. 我永远不会使用符号链接来解决由于不同的sonname而丢失的库问题
  9. 我永远不会使用符号链接来解决由于不同的sonname而丢失的库问题
  10. 我永远不会使用符号链接来解决由于不同的sonname而丢失的库问题

永远不要永远不要通过符号链接来解决这种问题。如果您的系统不提供库或可执行文件所需的确切名称,则需要重新编译该库或可执行文件。库在其文件名中包含sonname版本号是有原因的,而sonname不匹配将导致动态链接器/加载器的not found。通过为库插入一个不完整的sonname,您只是破坏了这个过程和整个系统

所以,要做的第一件事是:去掉你引入的符号链接。进入/usr/lib/x86_64-linux-gnu/并删除它。。


那么,如何重新编译插件,使其在Ubuntu上工作?

(或者,实际上,任何地方。即使是Windows或Mac。只需调整说明)

Step by Step:

  1. 安装mysql开发包。在Ubuntu上,它应该是libmysqlclient-dev包,但是要仔细检查,以防在你的特定Ubuntu版本上名称改变。进入https://packages.ubuntu.com并使用基于文件的搜索来查找mysql.h
  2. 从安装程序中运行维护工具,并要求它也安装Qt源组件。您将在Qt安装目录中找到该工具。
  3. INSTALL_DIR/Src/5.7/qtbase/src/plugins/sqldrivers/mysql下(根据实际情况调整INSTALL_DIR5.7)。
  4. 运行右边的 qmake。右边的是来自同一个Qt安装的那个,它的版本与源代码匹配。在你的情况下,它可能是在INSTALL_DIR/5.7/gcc_64/bin/qmake
  5. 运行make。如果由于没有找到某些库而导致编译失败,请在系统上安装所需的软件包。上面链接的Ubuntu包搜索可能会有用。
  6. 一旦make运行成功,它将创建一个新的libqsqlmysql.so。它应该自动覆盖INSTALL_DIR/5.7/gcc_64/plugins/sqldrivers中的那个。如果因为任何原因它没有被自动覆盖,手动移动到那里。

完成了!