我试图在QT5.9.1中使用protobufs v3.3.2。这适用于一些Qt应用程序,但前提是它们是命令行程序。一旦我用Qt和protobufs创建了一个GUI应用程序,我就会得到以下错误:
此程序是针对协议缓冲区运行时库的2.6.1版本编译的,该版本与已安装的版本(3.3.2)不兼容。如果要更新,请与程序作者联系。如果您自己编译了该程序,请确保您的头来自与链接时间库相同版本的协议缓冲区。(版本验证在"/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版本不匹配。
我正在Ubuntu16.04上进行开发,并使用默认的桌面环境()。
周旋
我的疑难解答揭示了这些症状和工作环境:
-platform eglfs运行Qt应用程序。这将使用OpenGL以全屏模式运行应用程序。程序运行,但窗口大小不正确。当使用-platform eglfs选项时,它甚至可以在Unity中工作,但是如果没有这个选项,它就会给出上面的错误。问题
如何在Qt应用程序中使用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发布于 2018-01-23 11:07:25
您可以为这里找到一个关于同一个问题的讨论,他们会讨论一个有趣的解决方法。
这个错误似乎是由位于/opt/Qt/5.9/gcc_64/plugins/platformthemes中的库/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依赖于系统,通常是在tensorflow使用的版本后面(从存储库下载自己的版本)。
好消息是,这个libgtk上的BUG已经报告并修复了,但是要使用固定版本,您必须移动到libgtk3.0 3.22 (参见BUG报告)。
发布于 2018-01-24 08:11:17
如果您正在从Ubuntu包存储库中使用Qt,则可以通过卸载qt5-gtk-platformtheme来删除违规的库。这将删除libqgtk3.so和相应的CMake文件,而不必求助于可能会产生意外后果的黑客攻击。
发布于 2020-03-05 06:28:04
作为布拉布杜兹说,此错误是由用于设置GUI样式的libqgtk3插件引起的。libqgtk3使用libmir系统库,它使用Protobuf2.6.1。这会导致应用程序启动时发生冲突。
我找到了一个解决办法,可以避免编辑Qt文件:
最后,我想指出,在Ubuntu16.04中运行项目时发生了这个错误,但是当我切换到18.04版本时,它就消失了。在18.04版本中,应用程序似乎使用默认的Qt样式,而不是GTK样式。
https://stackoverflow.com/questions/45703619
复制相似问题