我正在尝试将 protobufs v 3.3.2 与 Qt 5.9.1 一起使用。 这适用于某些 Qt 应用程序,但前提是它们是命令行程序。 一旦我用 Qt 和 protobufs 创建了一个 GUI 应用程序,我就会收到这个错误:

[libprotobuf FATAL /home/mkraus/Documents/dev/star385/build/linux-desktop-debug-libs/protobuf/src/src/google/protobuf/stubs/common.cc:78]这个程序是针对 2.6 版编译的。 Protocol Buffer 运行时库的 1,与已安装的版本 (3.3.2) 不兼容。 联系程序作者以获取更新。 如果您自己编译程序,请确保您的头文件来自与链接时库相同版本的 Protocol Buffers。 (版本验证在“/build/mir-ui6vjS/mir-0.26.3+16.04.20170605/obj-x86_64-linux-gnu/src/protobuf/mir_protobuf.pb.cc”中失败。)

我应该澄清一下,我的代码部分肯定使用了 3.3.2 版(我正在从 git 源下载和编译 protobufs 并进行静态链接)。 查看下面的堆栈跟踪,了解 Qt 引用的某些内容导致 protobuf 版本不匹配。

我正在 Ubuntu 16.04 上开发并使用默认桌面环境 (Unity)。

变通办法

我的故障排除揭示了这些症状和解决方法:

  • 使用 KDE/KUbuntu。 登录时更改桌面环境完全避免了版本不匹配的问题。

  • 使用-platform eglfs运行 Qt 应用程序。 这将使用 OpenGL 以全屏模式运行应用程序。 程序运行,但窗口大小不正确。 使用-platform eglfs选项时,它甚至可以在 Unity 中工作,但如果没有此选项,则会出现上述错误。

  • 任何仅限命令行的 Qt 应用程序(使用 QCoreApplication 而不是 QGuiApplication)都可以使用 protobufs 3.3.2。 更改同一个应用程序以使用 GUI 会导致版本不匹配问题。

问题

如何将 protobufs 3.3.2 与 Qt GUI 应用程序一起使用,并且不依赖于正在使用的桌面环境? Qt使用的是protobufs 2.6.1版本吗,如果是的话,编译Qt使用protobufs 3.3.2是否可行?

调试信息

这是一个堆栈跟踪(程序在启动时几乎立即崩溃):

terminate called after throwing an instance of 'google::protobuf::FatalException'
  what():  This program was compiled against version 2.6.1 of the Protocol Buffer runtime library, which is not compatible with the installed version (3.3.2).  Contact the program author for an update.  If you compiled the program yourself, make sure that your headers are from the same version of Protocol Buffers as your link-time library.  (Version verification failed in "/build/mir-ui6vjS/mir-0.26.3+16.04.20170605/obj-x86_64-linux-gnu/src/protobuf/mir_protobuf.pb.cc".)

Thread 1 "scan" received signal SIGABRT, Aborted.
0x00007ffff4dff428 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:54
54  ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) bt
#0  0x00007ffff4dff428 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:54
#1  0x00007ffff4e0102a in __GI_abort () at abort.c:89
#2  0x00007ffff543984d in __gnu_cxx::__verbose_terminate_handler() () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#3  0x00007ffff54376b6 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#4  0x00007ffff5437701 in std::terminate() () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#5  0x00007ffff5437919 in __cxa_throw () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#6  0x0000000000603e0a in google::protobuf::internal::LogMessage::Finish (this=0x7fffffffc250)
    at /home/mkraus/Documents/dev/star385/build/linux-desktop-debug-libs/protobuf/src/src/google/protobuf/stubs/common.cc:268
#7  0x0000000000603e5a in google::protobuf::internal::LogFinisher::operator= (this=0x7fffffffc20f, other=...)
    at /home/mkraus/Documents/dev/star385/build/linux-desktop-debug-libs/protobuf/src/src/google/protobuf/stubs/common.cc:276
#8  0x0000000000603171 in google::protobuf::internal::VerifyVersion (headerVersion=2006001, minLibraryVersion=2006000, 
    filename=0x7fffde80aec0 "/build/mir-ui6vjS/mir-0.26.3+16.04.20170605/obj-x86_64-linux-gnu/src/protobuf/mir_protobuf.pb.cc")
    at /home/mkraus/Documents/dev/star385/build/linux-desktop-debug-libs/protobuf/src/src/google/protobuf/stubs/common.cc:86
#9  0x00007fffde7d490b in mir::protobuf::protobuf_AddDesc_mir_5fprotobuf_2eproto() ()
   from /usr/lib/x86_64-linux-gnu/libmirprotobuf.so.3
#10 0x00007fffde7d2409 in ?? () from /usr/lib/x86_64-linux-gnu/libmirprotobuf.so.3
#11 0x00007ffff7de76ba in call_init (l=<optimized out>, argc=argc@entry=1, argv=argv@entry=0x7fffffffd5d8, 
    env=env@entry=0x7fffffffd5e8) at dl-init.c:72
#12 0x00007ffff7de77cb in call_init (env=0x7fffffffd5e8, argv=0x7fffffffd5d8, argc=1, l=<optimized out>) at dl-init.c:30
#13 _dl_init (main_map=main_map@entry=0xa2f450, argc=1, argv=0x7fffffffd5d8, env=0x7fffffffd5e8) at dl-init.c:120
#14 0x00007ffff7dec8e2 in dl_open_worker (a=a@entry=0x7fffffffc6e0) at dl-open.c:575
#15 0x00007ffff7de7564 in _dl_catch_error (objname=objname@entry=0x7fffffffc6d0, errstring=errstring@entry=0x7fffffffc6d8, 
    mallocedp=mallocedp@entry=0x7fffffffc6cf, operate=operate@entry=0x7ffff7dec4d0 <dl_open_worker>, args=args@entry=0x7fffffffc6e0)
    at dl-error.c:187
#16 0x00007ffff7debda9 in _dl_open (file=0xa2f048 "/opt/Qt5.8.0/5.8/gcc_64/plugins/platformthemes/libqgtk3.so", mode=-2147479551, 
    caller_dlopen=0x7ffff599b7a8, nsid=-2, argc=<optimized out>, argv=<optimized out>, env=0x7fffffffd5e8) at dl-open.c:660
#17 0x00007ffff1806f09 in dlopen_doit (a=a@entry=0x7fffffffc910) at dlopen.c:66
#18 0x00007ffff7de7564 in _dl_catch_error (objname=0xa02b80, errstring=0xa02b88, mallocedp=0xa02b78, 
    operate=0x7ffff1806eb0 <dlopen_doit>, args=0x7fffffffc910) at dl-error.c:187
#19 0x00007ffff1807571 in _dlerror_run (operate=operate@entry=0x7ffff1806eb0 <dlopen_doit>, args=args@entry=0x7fffffffc910)
    at dlerror.c:163
#20 0x00007ffff1806fa1 in __dlopen (file=<optimized out>, mode=<optimized out>) at dlopen.c:87
#21 0x00007ffff599b7a8 in ?? () from /opt/Qt5.8.0/5.8/gcc_64/lib/libQt5Core.so.5
#22 0x00007ffff5994fd5 in ?? () from /opt/Qt5.8.0/5.8/gcc_64/lib/libQt5Core.so.5
#23 0x00007ffff598a647 in QFactoryLoader::instance(int) const () from /opt/Qt5.8.0/5.8/gcc_64/lib/libQt5Core.so.5
#24 0x00007ffff6b392f1 in ?? () from /opt/Qt5.8.0/5.8/gcc_64/lib/libQt5Gui.so.5
#25 0x00007ffff6b43538 in QGuiApplicationPrivate::createPlatformIntegration() () from /opt/Qt5.8.0/5.8/gcc_64/lib/libQt5Gui.so.5
#26 0x00007ffff6b43edd in QGuiApplicationPrivate::createEventDispatcher() () from /opt/Qt5.8.0/5.8/gcc_64/lib/libQt5Gui.so.5
#27 0x00007ffff59a57d6 in QCoreApplicationPrivate::init() () from /opt/Qt5.8.0/5.8/gcc_64/lib/libQt5Core.so.5
#28 0x00007ffff6b456ab in QGuiApplicationPrivate::init() () from /opt/Qt5.8.0/5.8/gcc_64/lib/libQt5Gui.so.5
#29 0x00007ffff6b46364 in QGuiApplication::QGuiApplication(int&, char**, int) () from /opt/Qt5.8.0/5.8/gcc_64/lib/libQt5Gui.so.5
#30 0x00000000005c55bd in main (argc=1, argv=0x7fffffffd5d8) at /home/mkraus/Documents/dev/star385/src/linux/ui/scan/main.cpp:35

#1楼 票数:5 已采纳

您可以在此处找到关于同一问题的讨论,他们讨论了一个有趣的解决方法。

这个错误似乎是由位于/opt/Qt/5.9/gcc_64/plugins/platformthemes的库libqgtk3.so引起的。 如果您的项目中不需要它,您可以重命名/删除它以使错误消失。

如果您使用 CMake 作为构建系统,您还需要注释文件/opt/Qt/5.9/gcc_64/lib/cmake/Qt5Gui/Qt5Gui_QGtk3ThemePlugin.cmake中的所有行以避免配置问题。

另外,真正的问题来自依赖于 libprotobuf 的库 libmir。 每当您尝试将最新的 tensorflow 与 libgtk3.0 一起使用时,您都可能会遇到此问题,因为这种硬依赖性。 由于 libmir 依赖于系统 libprotobuf,它通常落后于 tensorflow 使用的版本(从存储库下载自己的版本)。

好消息是,libgtk 上的这个 BUG 已被报告并修复,但是要使用修复版本,您必须移动到 libgtk3.0 3.22(参见 BUG 报告)。

#2楼 票数:3

如果您使用的是来自 Ubuntu 包存储库的 Qt,您可以通过卸载qt5-gtk-platformtheme来删除有问题的库。 这将删除libqgtk3.so和相应的 CMake 文件,而不必求助于可能产生意外后果的黑客攻击。

#3楼 票数:1

正如Blabdouze 所说,这个错误是由用于设置 GUI 样式的 libqgtk3 插件引起的。 libqgtk3 使用 libmir 系统库,它使用 protobuf 2.6.1。 这会导致应用程序启动时发生冲突。

我找到了一种解决方法,可以让您避免编辑 Qt 文件:

  1. 您需要将“plugins”文件夹从“.../Qt/5.хх.хх/gcc_64/”复制到其他位置(例如,在项目构建文件夹旁边)。
  2. 然后您必须从复制的文件夹中删除“platformthemes/libqgtk3.so”和“platformthemes/libqgtk3.so.debug”。
  3. 在main()中,在创建QApplication实例之前,调用静态函数“QApplication::setLibraryPaths("path/to/copied/plugins/folder")”。
  4. 最后,您必须在 Qt Creator 的项目“环境设置”中添加值为“.../Qt/5.хх.хх/gcc_64/lib”(正确路径取决于您的 Qt 版本)的变量“LD_LIBRARY_PATH”。 您还可以添加值为“1”的“QT_DEBUG_PLUGINS”变量。 它将允许您检查您的项目使用了哪些插件并从发布版本中删除不必要的插件。

总之,我想指出这个错误是在 Ubuntu 16.04 中运行项目时发生的,但是当我切换到 18.04 版本时它消失了。 似乎在 18.04 版本中应用程序使用默认的 Qt 样式而不是 GTK 样式。

  ask by Matthew Kraus translate from so

未解决问题?本站智能推荐:

3回复

Protobuf 版本与 Qt 冲突

我正在尝试将 protobufs v 3.3.2 与 Qt 5.9.1 一起使用。 这适用于某些 Qt 应用程序,但前提是它们是命令行程序。 一旦我用 Qt 和 protobufs 创建了一个 GUI 应用程序,我就会收到这个错误: [libprotobuf FATAL /home/mkra
1回复

Qt / QML:WebEngineView和ScrollView

我有一个桌面应用程序,其中有一个ScrollView包含一个ListView ,其中的每个委托都包含多个小部件,其中包括WebEngineView : 我遇到的问题是滚动。 在Mac上,如果我使用触摸板滚动,则ListView仅在鼠标悬停在非WebEngineView小部件之一上时We
1回复

将数据从html传递到QT

我使用提交按钮在html中创建了一个简单的登录表单,单击该表单时,Javascript函数会检查登录是否正确。 全部将所有文件放入QT中的qrc文件中,我编写了以下代码来运行程序: login.pro 主窗口 主窗口 index.html
1回复

Qt 5.4 beta WebEngineView调试

我目前正在开发一个使用Qt 5.4的VS2013项目。 公测。 我使用QWebEngineView(它是基于Chromium的QWebEngine的一部分),它从Web服务器加载Javascript / HTML页面。 我想知道是否有可能为该QWebEngineView(或更常见的QW
2回复

如何使QWebEngineView全屏显示[Qt 5.8]

我有以下代码,我想使我的QWebEngineView (Qt 5.8)进入全屏状态。 我的WebView类位于QTabWidget因此它只是填充选项卡而不是整个屏幕。 如何使其全屏显示?
2回复

Qt 5:在QtWebEngine中访问Cookie

是否可以像以前使用QtWebKit一样在QtWebEngine访问QNetworkCookieJar ? 我在文档的任何地方都找不到它...
4回复

Qt + protobuf,类型?

我想在Qt开发中深入研究Google的协议缓冲区,但我无法弄清楚如何最好地合并它们。 最后,我想使用协议缓冲区使用QUdpSocket和QTcpSocket发送。 在协议缓冲区message之间进行通过套接字( QByteArray )发送数据然后再在另一侧发送数据的最佳方法是什么?
1回复

Qt WebEngine调试版本崩溃

我的项目使用qt webengine。 发行版本运行良好,但是当我浏览tumblr.com时,调试版本会很快崩溃 。 错误消息如下所示。 我想知道这是什么信息,以及如何解决它。 版本: 错误输出: WebView初始化: WebView是一个委托类,什么也不做
1回复

QWebEngineView立即崩溃,尤其是在滚动后-Qt5.8

我正在尝试一个简单的QWebEngineView示例,但是它一直崩溃,我也不知道为什么。 这是main.cpp中的代码 这是.pro文件 这是我收到的错误消息 我在korora 25(基于fedora)机器上运行Qt 5.8。
1回复

如何在我的代码中使用createWindow [Qt5.8]

在下面的代码中,当网站请求新的标签或窗口时,它不会打印任何内容。 如何使我的代码正常工作? 请帮忙,我太困惑了。 谢谢 !