2017-01-31 10 views
5

現在、Tensorflowの共有ライブラリを非bazelプロジェクトで使用しようとしています。そのため、bazelを使用してtensorflowから.soファイルを作成します。OpencvとTensorflowを使用した場合のProtobufのバージョンC++

が、私はOpenCVのとTensorflowの両方を使用するC++プログラムを起動したとき、それは私、次のエラーになり:FATAL外部/いるProtobuf/SRC /グーグル/いるProtobuf /スタブ/ common.cc libprotobuf [

: 78]このプログラムは、インストールされたバージョン(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") インスタンスをスローした後にterminateを終了しますこのプログラムは、インストールされたバージョン(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) 放棄されたコア(コアダンプされた)

私を助けることができますか?

はあなたに

+1

実際にはっきりしていないメッセージはありますか? –

+0

3.1.0バージョンをインストールしようとしても同じ問題が発生する –

+0

***このプログラムは、インストールされているバージョンと互換性のないバージョン2.6.1のプロトコルバッファランタイムライブラリに対してコンパイルされています3.1.0)。更新プログラムのプログラムの作成者に連絡してください。*** protobuf 3.1.0を使用してライブラリを再コンパイルしましたか? –

答えて

1

ありがとうございましたエラーは、プログラムがいるProtobuf 2.6.1からヘッダ(.hファイル)を使用してコンパイルされたことを示しています。これらのヘッダーは、通常、お使いのOSやプログラムの構築方法によって異なる場合がありますが、/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/lib/x86_64-linux-gnu /')を実行します。 –

+0

メッセージは、プログラムが古いprotobufヘッダーでコンパイルされたことを示しています。私はそのエラーメッセージを書いた人であり、間違っていないことを保証することができます。あなたはプログラムが古いヘッダーで終わった方法を把握しなければならないでしょう。もう1つの可能性は、プログラムのビルドシステムが、システムインストールのコピーを使用するのではなく、ローカルビルドに独自のヘッダーのコピー(間違ったバージョンを含む)をダウンロードすることです。しかし、私は知らない。ここには無限の可能性があります。 –

+1

あなたは正しいです、ここに無限の可能性があります。 OpenCvをインストールしたときに、GTK3でやっていますが(問題はgtk3がprotobuf 2.6.1に依存しています)、同じcppファイルでOpencvとtensorflowを使用すると、なぜこのエラーが表示されるのですか? 問題を解決するために、私はprotobuf 2.6.1でdepandしないGTK2でopencvをインストールしました。私はあなたの助けに感謝@ケントン・ヴァルダ。 –

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のようなものは、もはやバックアップパスを持っているシェルから実行せずに動作することはありませんLD_LIBRARY_PATHに追加
がうまくいけば、より良い修正がそこにあります:-(?

+0

私はあなたがまだ問題を抱えている場合、答えとして投稿したこれに対する解決策を見つけました。 – zo7

1

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

ここからは、これは、ライブラリを通じて地球と利用可能なtensorflow名前空間、WHIのすべてを行います

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

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の内容:これを行うにはAndroidのライブラリリセットを隠して、protobufとの衝突を防ぎます。

(これは時間の無駄ですので、私は助けてください!)

関連する問題