【问题标题】:Qt 5.10.0 MySQL drivers fails to compile on Fedora 27Qt 5.10.0 MySQL 驱动程序无法在 Fedora 27 上编译
【发布时间】:2018-07-19 01:24:06
【问题描述】:

我最近将我的机器更新到了最新版本的 Fedora Linux 27 和 Qt 5.10.0。 Qt 框架是使用离线安装程序 qt-opensource-linux-x64-5.10.0 安装的,我通常这样做。在安装过程中检查了所有选项,以确保安装了所有插件、源和库。这也是我通常在更新后重新安装 Qt 的方式。

现在的问题是 MySQL 驱动没有加载

QSqlDatabase: QMYSQL driver not loaded

以前在 Qt 5.8 或 5.7 等早期版本中,此问题已通过链接正确版本的 libmysqlclient.so 或从 Src 目录重新编译来解决。但这现在根本行不通。

所以这里是需要 MySQL 的 Qt 程序的 ldd

linux-vdso.so.1 (0x00007ffc13709000)
    libmysqlclient.so.21 => /usr/lib64/mysql/libmysqlclient.so.21 (0x00007f59732cb000)
    libzmq.so.5 => /usr/local/lib/libzmq.so.5 (0x00007f5973045000)
    libQt5WebEngineWidgets.so.5 => /opt/Qt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5WebEngineWidgets.so.5 (0x00007f5972e04000)
    libQt5PrintSupport.so.5 => /opt/Qt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5PrintSupport.so.5 (0x00007f5972b97000)
    libQt5Widgets.so.5 => /opt/Qt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5Widgets.so.5 (0x00007f597235e000)

可以看出这需要已经安装的最新版本的mysql libmysqlclient.so.21库

这是 /opt/Qt/Qt5.10.0/5.10.0/gcc_64/plugins/sqldrivers/libqsqlmysql.so 的 ldd 输出

linux-vdso.so.1 (0x00007ffeb8bf8000)
    libQt5Sql.so.5 => /opt/Qt/Qt5.10.0/5.10.0/gcc_64/plugins/sqldrivers/./../../lib/libQt5Sql.so.5 (0x00007f60cd408000)
    libQt5Core.so.5 => /opt/Qt/Qt5.10.0/5.10.0/gcc_64/plugins/sqldrivers/./../../lib/libQt5Core.so.5 (0x00007f60cccba000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f60cca9b000)
    libmysqlclient.so.18 => not found
    libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f60cc715000)
    libm.so.6 => /lib64/libm.so.6 (0x00007f60cc3c0000)
    libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f60cc1a9000)
    libc.so.6 => /lib64/libc.so.6 (0x00007f60cbdc6000)
    libz.so.1 => /lib64/libz.so.1 (0x00007f60cbbaf000)
    libicui18n.so.56 => /opt/Qt/Qt5.10.0/5.10.0/gcc_64/plugins/sqldrivers/./../../lib/libicui18n.so.56 (0x00007f60cb716000)
    libicuuc.so.56 => /opt/Qt/Qt5.10.0/5.10.0/gcc_64/plugins/sqldrivers/./../../lib/libicuuc.so.56 (0x00007f60cb35e000)
    libicudata.so.56 => /opt/Qt/Qt5.10.0/5.10.0/gcc_64/plugins/sqldrivers/./../../lib/libicudata.so.56 (0x00007f60c997b000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007f60c9777000)
    libgthread-2.0.so.0 => /lib64/libgthread-2.0.so.0 (0x00007f60c9575000)
    libglib-2.0.so.0 => /lib64/libglib-2.0.so.0 (0x00007f60c9261000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f60cd863000)
    libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f60c8fee000)

很明显这是说 libmysqlclient.so.18 => not found 因为安装了最新版本的 libmysqlclient.so.21。

现在当我尝试重新编译驱动程序时,我遇到了一个重复的问题

qsql_mysql.cpp:235:9: error: ‘my_bool’ does not name a type; did you mean ‘_Bool’?

这就是我所做的

    cd /opt/Qt/Qt5.10.0/5.10.0/Src/qtbase/src/plugins/sqldrivers/mysql

/opt/Qt/Qt5.10.0/5.10.0/gcc_64/bin/qmake "INCLUDEPATH+=/usr/include/mysql" "LIBS+=-L/usr/lib64/mysql"  mysql.pro

make

Make 失败并出现一个奇怪的错误

 g++ -c -pipe -O2 -std=c++1z -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -Wall -W -Wvla -Wdate-time -D_REENTRANT -fPIC -DQT_NO_NARROWING_CONVERSIONS_IN_CONNECT -DQT_NO_CAST_TO_ASCII -DQT_NO_CAST_FROM_ASCII -DQT_NO_EXCEPTIONS -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -DQT_NO_DEBUG -DQT_PLUGIN -DQT_SQL_LIB -DQT_CORE_LIB -I. -I/opt/Qt/Qt5.10.0/5.10.0/gcc_64/include/QtSql/5.10.0 -I/opt/Qt/Qt5.10.0/5.10.0/gcc_64/include/QtSql/5.10.0/QtSql -I/opt/Qt/Qt5.10.0/5.10.0/gcc_64/include/QtCore/5.10.0 -I/opt/Qt/Qt5.10.0/5.10.0/gcc_64/include/QtCore/5.10.0/QtCore -I/opt/Qt/Qt5.10.0/5.10.0/gcc_64/include -I/opt/Qt/Qt5.10.0/5.10.0/gcc_64/include/QtSql -I/opt/Qt/Qt5.10.0/5.10.0/gcc_64/include/QtCore -I.moc -isystem /usr/include/mysql -I/opt/Qt/Qt5.10.0/5.10.0/gcc_64/mkspecs/linux-g++ -o .obj/qsql_mysql.o qsql_mysql.cpp
qsql_mysql.cpp:235:9: error: ‘my_bool’ does not name a type; did you mean ‘_Bool’?
         my_bool nullIndicator;
         ^~~~~~~
         _Bool
qsql_mysql.cpp: In constructor ‘QMYSQLResultPrivate::QMyField::QMyField()’:
qsql_mysql.cpp:231:28: error: class ‘QMYSQLResultPrivate::QMyField’ does not have any field named ‘nullIndicator’
             : outField(0), nullIndicator(false), bufLength(0ul),
                            ^~~~~~~~~~~~~
qsql_mysql.cpp: In member function ‘bool QMYSQLResultPrivate::bindInValues()’:
qsql_mysql.cpp:430:28: error: ‘struct QMYSQLResultPrivate::QMyField’ has no member named ‘nullIndicator’
         bind->is_null = &f.nullIndicator;
                            ^~~~~~~~~~~~~
qsql_mysql.cpp: In member function ‘virtual QVariant QMYSQLResult::data(int)’:
qsql_mysql.cpp:641:15: error: ‘const struct QMYSQLResultPrivate::QMyField’ has no member named ‘nullIndicator’
         if (f.nullIndicator)
               ^~~~~~~~~~~~~
qsql_mysql.cpp: In member function ‘virtual bool QMYSQLResult::isNull(int)’:
qsql_mysql.cpp:734:35: error: ‘const struct QMYSQLResultPrivate::QMyField’ has no member named ‘nullIndicator’
        return d->fields.at(field).nullIndicator;
                                   ^~~~~~~~~~~~~
qsql_mysql.cpp: In member function ‘virtual bool QMYSQLResult::exec()’:
qsql_mysql.cpp:987:13: error: ‘my_bool’ was not declared in this scope
     QVector<my_bool> nullVector;
             ^~~~~~~
qsql_mysql.cpp:987:13: note: suggested alternative: ‘_Bool’
     QVector<my_bool> nullVector;
             ^~~~~~~
             _Bool
qsql_mysql.cpp:987:20: error: template argument 1 is invalid
     QVector<my_bool> nullVector;
                    ^
qsql_mysql.cpp:1001:20: error: request for member ‘resize’ in ‘nullVector’, which is of non-class type ‘int’
         nullVector.resize(values.count());
                    ^~~~~~
qsql_mysql.cpp:1008:25: error: invalid types ‘int[int]’ for array subscript
             nullVector[i] = static_cast<my_bool>(val.isNull());
                         ^
qsql_mysql.cpp:1008:41: error: ‘my_bool’ does not name a type; did you mean ‘_Bool’?
             nullVector[i] = static_cast<my_bool>(val.isNull());
                                         ^~~~~~~
                                         _Bool
qsql_mysql.cpp:1009:46: error: invalid types ‘int[int]’ for array subscript
             currBind->is_null = &nullVector[i];
                                              ^
qsql_mysql.cpp:1105:17: error: expected ‘;’ before ‘update_max_length’
         my_bool update_max_length = true;
                 ^~~~~~~~~~~~~~~~~
qsql_mysql.cpp:1114:72: error: ‘update_max_length’ was not declared in this scope
             mysql_stmt_attr_set(d->stmt, STMT_ATTR_UPDATE_MAX_LENGTH, &update_max_length);
                                                                        ^~~~~~~~~~~~~~~~~
qsql_mysql.cpp: In member function ‘virtual bool QMYSQLDriver::open(const QString&, const QString&, const QString&, const QString&, int, const QString&)’:
qsql_mysql.cpp:1316:5: error: ‘my_bool’ was not declared in this scope
     my_bool reconnect=false;
     ^~~~~~~
qsql_mysql.cpp:1316:5: note: suggested alternative: ‘_Bool’
     my_bool reconnect=false;
     ^~~~~~~
     _Bool
qsql_mysql.cpp:1334:21: error: ‘reconnect’ was not declared in this scope
                     reconnect = true;
                     ^~~~~~~~~
qsql_mysql.cpp:1334:21: note: suggested alternative: ‘connect’
                     reconnect = true;
                     ^~~~~~~~~
                     connect
qsql_mysql.cpp:1415:13: error: ‘reconnect’ was not declared in this scope
         if (reconnect)
             ^~~~~~~~~
qsql_mysql.cpp:1415:13: note: suggested alternative: ‘connect’
         if (reconnect)
             ^~~~~~~~~
             connect
make: *** [Makefile:806: .obj/qsql_mysql.o] Error 1

说真的,我已经使用 Qt 好几年了,在设置 MySQL 驱动程序时我从来没有遇到过这个问题。奇怪的是,现在机器都更新了所有最新版本。

请告诉我如何解决这个问题。现在已经在互联网上搜索了将近一周,但没有解决此错误。我尝试的一切总是以错误结束

qsql_mysql.cpp:235:9: error: ‘my_bool’ does not name a type; did you mean ‘_Bool’?

【问题讨论】:

  • 可能类似于这个windows问题MySQL Driver for Qt
  • 不会卡在同一个地方。复制不起作用。并且重新编译 sqldrivers 继续给我同样的错误qsql_mysql.cpp:235:9: error: ‘my_bool’ does not name a type; did you mean ‘_Bool’?

标签: c++ mysql linux qt


【解决方案1】:

所以终于找到了解决方案。我必须重新安装 Fedora 27,这次安装了 Fedora 25 中的以前的 MySQL 版本

dnf install https://dev.mysql.com/get/mysql57-community-release-fc25-9.noarch.rpm dnf install mysql-community-server

还安装了所有其他依赖项。之后像往常一样从离线包中安装 Qt 5.10.0。然后重新编译了sqldrivers,一切顺利,没有出现任何错误。

所以我猜 MySQL 8.0 目前与 Qt 不兼容。

【讨论】:

    【解决方案2】:

    我在 QT 论坛上找到了另一个人的解决方案:https://forum.qt.io/topic/114022/different-versions-of-qt-with-different-versions-of-mysql

    只需打开文件 qsql_mysql.cpp 并添加“typedef bool my_bool;”就在初始标头包含定义所在的位置之后。

    那你应该可以走了。

    【讨论】:

      猜你喜欢
      • 2020-04-22
      • 1970-01-01
      • 2013-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-19
      • 1970-01-01
      相关资源
      最近更新 更多