Protobuf版本与Qt

时间:2017-08-16 01:05:47

标签: c++ qt ubuntu protocol-buffers qtwebengine

我正在尝试使用带有Qt 5.9.1的protobufs v 3.3.2。这适用于一些Qt应用程序,但仅限于它们是命令行程序。一旦我使用Qt和protobufs创建GUI应用程序,我就会收到此错误:

  

[libprotobuf致命   /home/mkraus/Documents/dev/star385/build/linux-desktop-debug-libs/protobuf/src/src/google/protobuf/stubs/common.cc:78]   此程序是根据协议缓冲区运行时库的2.6.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会导致版本不匹配问题。

问题

如何在Qt GUI应用程序中使用protobufs 3.3.2,还不依赖于正在使用的桌面环境? 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

3 个答案:

答案 0 :(得分:5)

您可以找到here关于同一问题的讨论,并讨论一个有趣的解决方法。

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

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

再加上,真正的问题来自库libmir,它依赖于libprotobuf。每当您尝试使用libgtk3.0的最新tensorflow时,您可能会遇到此问题,因为这种依赖性很强。因为libmir依赖于系统libprotobuf,它通常位于tensorflow使用的版本后面(从存储库下载自己的版本)。

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

答案 1 :(得分:3)

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

答案 2 :(得分:1)

Blabdouze said一样,此错误是由用于设置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. 最后,必须在项目的“环境设置”中,将变量“ LD_LIBRARY_PATH”添加为值“ ... / Qt /5.хх.хх/ gcc_64 / lib”(正确的路径取决于您的Qt版本)。 Qt Creator。您还可以添加一个值为“ 1”的“ QT_DEBUG_PLUGINS”变量。它将允许您检查项目使用了哪些插件,并从发行版中删除不必要的插件。

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