Подтвердить что ты не робот

Протобуф-версия конфликтует с Qt

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

[libprotobuf FATAL/home/mkraus/Documents/dev/star385/build/linux-desktop-debug-libs/protobuf/src/src/google/protobuf/stubs/common.cc:78] Эта программа была скомпилирована против версии 2.6. 1 библиотеки времени выполнения протокола Buffer, которая несовместима с установленной версией (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 (я загружаю и компилирую protobuf из источников git и статически привязываю). Посмотрите на трассировку стека ниже, чтобы увидеть, что что-то, что указывает Qt, вызывает несоответствие версии protobuf.

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

Обходные

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

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

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

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

Вопросы

Как использовать 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 ([email protected]=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 ([email protected]=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>, [email protected]=1, [email protected]=0x7fffffffd5d8, 
    [email protected]=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 ([email protected]=0xa2f450, argc=1, argv=0x7fffffffd5d8, env=0x7fffffffd5e8) at dl-init.c:120
#14 0x00007ffff7dec8e2 in dl_open_worker ([email protected]=0x7fffffffc6e0) at dl-open.c:575
#15 0x00007ffff7de7564 in _dl_catch_error ([email protected]=0x7fffffffc6d0, [email protected]=0x7fffffffc6d8, 
    [email protected]=0x7fffffffc6cf, [email protected]=0x7ffff7dec4d0 <dl_open_worker>, [email protected]=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 ([email protected]=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 ([email protected]=0x7ffff1806eb0 <dlopen_doit>, [email protected]=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
4b9b3361

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

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

Ответ 2

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