2017-01-31 2 views
5

В настоящее время я пытаюсь использовать общую библиотеку Tensorflow в проекте, отличном от bazel, поэтому я создаю файл .so из shadoworflow с помощью bazel.Конфликт Протобуф-версия при использовании Opencv и Tensorflow C++

, но когда я запускаю C++ программы, которая использует как OpenCV и Tensorflow, он делает мне следующую ошибку:

[libprotobuf СМЕРТЕЛЬНЫМ внешним/Protobuf/SRC/Google/Protobuf/штыри/common.cc: 78] Эта программа была скомпилирована против версии 2.6.1 библиотеки времени исполнения протокола Buffer, которая несовместима с установленной версией (3.1.0). Обратитесь к автору программы за обновлением. Если вы сами скомпилировали программу, убедитесь, что ваши заголовки из той же версии протокольных буферов, что и ваша библиотека времени ссылок. (Ошибка верификации версии в "/build/mir-pkdHET/mir-0.21.0+16.04.20160330/obj-x86_64-linux-gnu/src/protobuf/mir_protobuf.pb.cc".) завершение вызова после бросания экземпляра of 'google :: protobuf :: FatalException'

what(): Эта программа была скомпилирована против версии 2.6.1 библиотеки времени выполнения протокола Buffer, которая несовместима с установленной версией (3.1.0). Обратитесь к автору программы за обновлением. Если вы сами скомпилировали программу, убедитесь, что ваши заголовки из той же версии протокольных буферов, что и ваша библиотека времени ссылок. (Ошибка верификации версии в "/build/mir-pkdHET/mir-0.21.0+16.04.20160330/obj-x86_64-linux-gnu/src/protobuf/mir_protobuf.pb.cc".) Отказ (сбрасываемый сердечник)

Вы можете мне помочь?

Спасибо

+1

Что на самом деле не ясно об этом сообщении? –

+0

проблема, даже если я пытаюсь установить версию 3.1.0, я все равно получаю ту же ошибку –

+0

*** Эта программа была скомпилирована против версии 2.6.1 библиотеки времени выполнения протокола Buffer, которая несовместима с установленной версией (3.1.0). Обратитесь к автору программы за обновлением. *** Вы перекомпилировали библиотеку, используя protobuf 3.1.0 ?? –

ответ

1

Ошибка указывает на то, что программа выполнила с помощью заголовков (.h файлы) из Protobuf 2.6.1. Эти заголовки обычно находятся в /usr/include/google/protobuf или /usr/local/include/google/protobuf, хотя они могут находиться в других местах в зависимости от вашей ОС и способа создания программы. Вам необходимо обновить эти заголовки до версии 3.1.0 и перекомпилировать программу.

+1

У меня есть правильный заголовок в '/ usr/local/include/google/protobuf' ..... Я обнаружил, что некоторые из файлов .so opencv зависят от' libprotobuf-lite.so.9' (который находится в '/ USR/Библиотека/x86_64-Linux-ГНУ /'). –

+0

Ну, в сообщении говорится, что программа была скомпилирована со старыми заголовками protobuf. Я тот, кто написал это сообщение об ошибке, и могу заверить вас, что это не так. Вам нужно будет выяснить, как программа закончилась старыми заголовками. Другая возможность заключается в том, что система сборки программы загружает собственную копию заголовков (с неправильной версией) в локальную сборку, а не использует системную копию. Но я не знаю. Здесь есть бесконечные возможности. –

+1

Вы правы, здесь есть бесконечные возможности. , когда я установил Opencv, я делаю это с GTK3 (но проблема в gtk3 зависит от protobuf 2.6.1), поэтому я вижу эту ошибку, когда я использую Opencv и tensorflow в том же файле cpp. Чтобы решить мою проблему, я установил opencv с GTK2, который не отпадает на protobuf 2.6.1. Благодарю вас за помощь @ Кентон Варда. –

1

Это действительно серьезная проблема! Я получаю ошибку ниже, похожий на вас:

$./ceres_single_test 
[libprotobuf FATAL google/protobuf/stubs/common.cc:78] This program was compiled against version 2.6.1 of the Protocol Buffer runtime library, which is not compatible with the installed version (3.1.0). 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-pkdHET/mir-0.21.0+16.04.20160330/obj-x86_64-linux-gnu/src/protobuf/mir_protobuf.pb.cc".) 
terminate called after throwing an instance of 'google::protobuf::FatalException' 
Aborted 

Мой обходной путь:

cd /usr/lib/x86_64-linux-gnu 
sudo mkdir BACKUP 
sudo mv libmirprotobuf.so* ./BACKUP/ 

Теперь, исполняемый под тестовых работ, остудить. Что это не круто, однако, заключается в том, что такие вещи, как Gedit больше не работают без запуска из командной строки, которая имеет путь BACKUP добавленный к LD_LIBRARY_PATH :-(
Надеюсь, там лучше исправить там?

+0

Я нашел решение, которое я отправил в качестве ответа, если у вас все еще есть проблемы. – zo7

1

Вы должны восстановить TensorFlow с сценарий компоновщика, чтобы избежать создания сторонних символов в общей библиотеке, создаваемой Bazel.Таким образом, библиотека Android Java/JNI для TensorFlow может сосуществовать с предустановленной библиотекой protobuf на устройстве (посмотрите на правила сборки в tensorflow/contrib/android для рабочего примера)

Вот файл BUILD, который я адаптировал из Андроид библиотека сделать это:

package(default_visibility = ["//visibility:public"]) 

licenses(["notice"]) # Apache 2.0 

exports_files(["LICENSE"]) 

load(
    "//tensorflow:tensorflow.bzl", 
    "tf_copts", 
    "if_android", 
) 

exports_files([ 
    "version_script.lds", 
]) 

# Build the native .so. 
# bazel build //tensorflow/contrib/android_ndk:libtensorflow_cc_inference.so \ 
# --crosstool_top=//external:android/crosstool \ 
# [email protected]_tools//tools/cpp:toolchain \ 
# --cpu=armeabi-v7a 
LINKER_SCRIPT = "//tensorflow/contrib/android:version_script.lds" 

cc_binary(
    name = "libtensorflow_cc_inference.so", 
    srcs = [], 
    copts = tf_copts() + [ 
     "-ffunction-sections", 
     "-fdata-sections", 
    ], 
    linkopts = if_android([ 
     "-landroid", 
     "-latomic", 
     "-ldl", 
     "-llog", 
     "-lm", 
     "-z defs", 
     "-s", 
     "-Wl,--gc-sections", 
     "-Wl,--version-script", # This line must be directly followed by LINKER_SCRIPT. 
     LINKER_SCRIPT, 
    ]), 
    linkshared = 1, 
    linkstatic = 1, 
    tags = [ 
     "manual", 
     "notap", 
    ], 
    deps = [ 
     "//tensorflow/core:android_tensorflow_lib", 
     LINKER_SCRIPT, 
    ], 
) 

и содержимое version_script.lds:

{ 
    global: 
    extern "C++" { 
     tensorflow::*; 
    }; 
    local: 
    *; 
}; 

Это сделает все, что в tensorflow пространстве имен глобальных и доступны через библиотеку, бее скрыть сброс и не дать ему противостоять протобуфу.

(потратил массу времени на это, так что я надеюсь, что это помогает!)

Смежные вопросы