Версия Protobuf конфликтует с Qt

Я пытаюсь использовать protobufs v 3.3.2 с Qt 5.9.1. Это работает с некоторыми приложениями Qt, но только если они являются программами командной строки. Как только я создаю приложение GUI с Qt и protobufs, я получаю эту ошибку:

[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). обратитесь к автору программы для обновления. Если вы скомпилировал программу самостоятельно, убедитесь, что ваши заголовки из та же версия буферов протокола, что и ваша библиотека времени ссылок. (Ошибка проверки версии "/build/mir-ui6vjS/mir-0.26.3+16.04.20170605/obj-x86_64-linux-gnu/src/protobuf/mir_protobuf.pb.cc".)

Я должен уточнить, что моя часть кода, безусловно, использует версию 3.3.2 (я загрузка и компиляция protobufs из источников git и статическое связывание). Посмотрите на трассировку стека ниже, чтобы увидеть, что что-то, на что ссылается Qt, вызывает несоответствие версии protobuf.

Я разрабатываю Ubuntu 16.04 и использую среду рабочего стола по умолчанию (Unity).

Обходные

моя диагностика выявила эти симптомы и обходные пути:

  • используйте KDE / KUbuntu. Изменение среды рабочего стола при входе в систему полностью исключает проблемы несоответствия версий.

  • запустите приложение Qt с помощью -platform eglfs. Это запускает приложение в полноэкранном режиме с помощью OpenGL. Программа запускается, но размер окна неверен. При использовании -platform eglfs опция, она работает даже в Unity, но без этой опции она дает мне вышеуказанную ошибку.

  • любое приложение Qt, которое является приложением только для командной строки (вместо этого используется QCoreApplication QGuiApplication) может использовать protobufs 3.3.2. Изменение того же приложения для использования GUI вызывает проблему несоответствия версий.

вопросы

как я могу использовать protobufs 3.3.2 с приложениями Qt GUI, а также не зависеть от того, какая среда рабочего стола используется? Это Qt использует версию 2.6.1 protobufs, и если да, то возможно ли скомпилировать 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

2 ответов


вы можете найти здесь обсуждение того же вопроса, и они говорят об интересном обходном пути.

кажется, что эта ошибка вызвана библиотекой 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. Вы можете запустить эту проблему при попытке использовать недавний tensorflow с libgtk3.0 из-за этой жесткой зависимости. Поскольку libmir зависит от системы libprotobuf, которая обычно находится за версией, используемой tensorflow (которая загружает свою собственную версию из репозитория).

хорошая новость, эта ошибка на libgtk была сообщена и исправлена, однако, чтобы использовать фиксированную версию, вы должны перейти на libgtk3.0 3.22 (см. отчет об ошибке.)


Если вы используете Qt из репозитория пакетов Ubuntu, вы можете удалить оскорбительную библиотеку, удалив qt5-gtk-platformtheme. Это будет удалить libqgtk3.so и соответствующий файл CMake без необходимости прибегать к взломам, которые могут иметь непреднамеренные последствия.