热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Protobuf版本与Qt冲突

如何解决《Protobuf版本与Qt冲突》经验,为你挑选了1个好方法。

我正在尝试使用带有Qt 5.9.1的protobufs v 3.3.2.这适用于一些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.登录时更改桌面环境可以完全避免版本不匹配问题.

运行Qt应用程序-platform eglfs.这使用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=, 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=) 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 , 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=, argv=, 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 , args=0x7fffffffc910) at dl-error.c:187
#19 0x00007ffff1807571 in _dlerror_run (operate=operate@entry=0x7ffff1806eb0 , args=args@entry=0x7fffffffc910)
    at dlerror.c:163
#20 0x00007ffff1806fa1 in __dlopen (file=, mode=) 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

小智.. 5

你可以在这里找到关于同一问题的讨论,他们谈论一个有趣的解决方法.

似乎这个错误是由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> 小智..:

你可以在这里找到关于同一问题的讨论,他们谈论一个有趣的解决方法.

似乎这个错误是由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报告).


推荐阅读
author-avatar
上海外国灬语大学-校友粉丝团
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有