c++ - Qmysql 驱动未加载但可用

标签 c++ mysql qt ubuntu qt5

我想将我的数据库(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. 我永远不会使用符号链接(symbolic link)来解决由于不同的 soname 而导致的库丢失问题
  2. 我永远不会使用符号链接(symbolic link)来解决由于不同的 soname 而导致的库丢失问题
  3. 我永远不会使用符号链接(symbolic link)来解决由于不同的 soname 而导致的库丢失问题
  4. 我永远不会使用符号链接(symbolic link)来解决由于不同的 soname 而导致的库丢失问题
  5. 我永远不会使用符号链接(symbolic link)来解决由于不同的 soname 而导致的库丢失问题
  6. 我永远不会使用符号链接(symbolic link)来解决由于不同的 soname 而导致的库丢失问题
  7. 我永远不会使用符号链接(symbolic link)来解决由于不同的 soname 而导致的库丢失问题
  8. 我永远不会使用符号链接(symbolic link)来解决由于不同的 soname 而导致的库丢失问题
  9. 我永远不会使用符号链接(symbolic link)来解决由于不同的 soname 而导致的库丢失问题
  10. 我永远不会使用符号链接(symbolic link)来解决由于不同的 soname 而导致的库丢失问题

永远永远通过符号链接(symbolic link)解决这类问题。如果您的系统不提供库或可执行文件所需的确切 soname,您将需要重新编译该库或可执行文件。库的文件名中包含 soname 版本号是有原因的,不匹配的 soname 将导致动态链接器/加载器的未找到。您只是通过为库插入损坏的 soname 来破坏该进程和您的整个系统

因此,要做的第一件事:删除您引入的符号链接(symbolic link)。进入 /usr/lib/x86_64-linux-gnu/ 并将其删除。 现在做。


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

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

一步一步:

  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. 运行制作。如果由于找不到某些库而无法编译,请在系统上安装所需的软件包。上面链接的 Ubuntu 软件包搜索可能会有用。
  6. 一旦make 运行成功,它将创建一个全新的libqsqlmysql.so。它应该会自动覆盖 INSTALL_DIR/5.7/gcc_64/plugins/sqldrivers 中的那个。如果由于任何原因它没有自动覆盖,请手动将其移动到那里。

完成!享受您的 MySQL 数据库连接。

关于c++ - Qmysql 驱动未加载但可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40328372/

相关文章:

c++ - 使用指针算法遍历同构 POD 结构

c++ - 如何在大字符串上应用最长公共(public)子序列算法?

c++ - Qt项目中如何使用预编译头文件

c++ - Qt 异步调用 : how to run something after an async call has finished its job

python - 在 PyQT4 程序中无法获得多语言支持

c++ - Ofstream 在 Ubuntu 上创建隐藏(?)文件(同时打开)

c++ - 带有隐藏控制台窗口的 AllocConsole()

mysql - 显示列的 3 个最大值,包括带条件的重复值

MySQL:计算空行的累积和

MySQL 检查 MAX 值是否重复