web-dev-qa-db-ja.com

OpencvとTensorflowc ++を使用する場合の競合するProtobufバージョン

現在、bazel以外のプロジェクトでTensorflowの共有ライブラリを使用しようとしているので、bazelを使用してtensorflowから.soファイルを作成します。

しかし、OpencvとTensorflowの両方を使用するc ++プログラムを起動すると、次のエラーが発生します。

[libprotobuf FATAL external/protobuf/src/google/protobuf/stubs/common.cc:78]このプログラムは、インストールされているバージョン(3.1.0)と互換性のないProtocolBufferランタイムライブラリのバージョン2.6.1に対してコンパイルされました。 。更新については、プログラムの作成者に問い合わせてください。プログラムを自分でコンパイルした場合は、ヘッダーがリンク時ライブラリと同じバージョンのプロトコルバッファからのものであることを確認してください。 (「/build/mir-pkdHET/mir-0.21.0+16.04.20160330/obj-x86_64-linux-gnu/src/protobuf/mir_protobuf.pb.cc」でバージョン検証に失敗しました。)のインスタンスをスローした後に呼び出された終了'google :: protobuf :: FatalException'

what():このプログラムは、インストールされているバージョン(3.1.0)と互換性のないプロトコルバッファランタイムライブラリのバージョン2.6.1に対してコンパイルされました。更新については、プログラムの作成者に問い合わせてください。プログラムを自分でコンパイルした場合は、ヘッダーがリンク時ライブラリと同じバージョンのプロトコルバッファからのものであることを確認してください。 (「/build/mir-pkdHET/mir-0.21.0+16.04.20160330/obj-x86_64-linux-gnu/src/protobuf/mir_protobuf.pb.cc」でバージョン検証に失敗しました。)放棄(コアダンプ)

手伝って頂けますか?

ありがとうございました

10
H. Abdessamad

このエラーは、プログラムがprotobuf 2.6.1のヘッダー(.hファイル)を使用してコンパイルされたことを示しています。これらのヘッダーは通常、/usr/include/google/protobufまたは/usr/local/include/google/protobufにありますが、OSやプログラムのビルド方法によっては、他の場所にある場合もあります。これらのヘッダーをバージョン3.1.0に更新し、プログラムを再コンパイルする必要があります。

4
Kenton Varda

Bazelが作成する共有ライブラリでサードパーティのシンボルがグローバルにならないように、リンカースクリプトを使用してTensorFlowを再構築する必要があります。これは、TensorFlowのAndroid Java/JNIライブラリがデバイスにプリインストールされたprotobufライブラリと共存できる方法です( tensorflow/contrib/Androidのビルドルールを参照してください) 実際の例)

これを行うために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 \
#   --Host_crosstool_top=@bazel_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名前空間内のすべてがグローバルになり、ライブラリから利用できるようになりますが、リセットが非表示になり、protobufとの競合が防止されます。

(これに多くの時間を無駄にしたので、それが役立つことを願っています!)

4
zo7

これは確かにかなり深刻な問題です!私はあなたに似た以下のエラーを受け取ります:

$./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/

これで、テスト対象の実行可能ファイルが機能します。ただし、クールではないのは、GDeditのようなものは、LD_LIBRARY_PATHにBACKUPパスが追加されたシェルから実行しないと機能しなくなることです:-(
うまくいけば、もっと良い修正がありますか?

2
peter karasev

このエラーは、インストールされているバージョンと互換性のないプロトコルバッファランタイムライブラリについて文句を言います。このエラーはGTK3ライブラリから発生しています。 GTK3はProtocolBuffer2.6.1を使用します。 GTK3を使用してOpencvをサポートしている場合、このエラーが発生します。これを修正する最も簡単な方法は、GTK3の代わりにQTを使用することです。

Cmake GUIを使用してOpencvをインストールする場合は、GTK3を使用する代わりにQTサポートを選択するだけです。次のコマンドを使用してQTをインストールできます。

Sudo apt install qtbase5-dev 
0