当使用Opencv和Tensorflow c ++时冲突Protobuf版本
我目前正尝试在非bazel项目中使用Tensorflow的共享库,所以我使用bazel从tensorflow创建.so文件。
但是当我启动一个同时使用Opencv和Tensorflow的c ++程序时,它会出现以下错误:
[libprotobuf FATAL external / protobuf / src / google / protobuf / stubs / common.cc:78]此程序是针对协议缓冲区运行时库2.6.1版进行编译的,该版本与安装的版本(3.1.0)不兼容, 。 联系程序作者以获取更新。 如果您自己编译该程序,请确保您的标题来自与您的链接时库相同版本的Protocol Buffers。 (版本验证在“/build/mir-pkdHET/mir-0.21.0+16.04.20160330/obj-x86_64-linux-gnu/src/protobuf/mir_protobuf.pb.cc”中失败。)在抛出一个实例后终止调用'谷歌:: protobuf的:: FatalException'
what():该程序是针对协议缓冲区运行时库2.6.1版进行编译的,与安装的版本(3.1.0)不兼容。 联系程序作者以获取更新。 如果您自己编译该程序,请确保您的标题来自与您的链接时库相同版本的Protocol Buffers。 (版本验证在“/build/mir-pkdHET/mir-0.21.0+16.04.20160330/obj-x86_64-linux-gnu/src/protobuf/mir_protobuf.pb.cc”中失败。)放弃(核心转储)
你可以帮我吗?
谢谢
该错误表明该程序使用来自protobuf 2.6.1的头文件( .h
文件)进行编译。 这些头文件通常位于/usr/include/google/protobuf
或/usr/local/include/google/protobuf
,尽管它们可能位于其他位置,具体取决于您的操作系统以及如何构建该程序。 您需要将这些标头更新到版本3.1.0并重新编译该程序。
您应该使用链接器脚本重建TensorFlow,以避免在Bazel创建的共享库中使第三方符号变为全局。 这就是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发生冲突。
(浪费了大量的时间,所以我希望它有帮助!)
这确实是一个非常严重的问题! 我得到了类似于你的下面的错误:
$./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/
现在,被测试的可执行文件起作用了,很酷。 然而,不酷的是,如果没有将BACKUP路径添加到LD_LIBRARY_PATH的外壳运行,像gedit这样的东西不再有效: -
希望有更好的解决办法吗?
上一篇: Conflict Protobuf version when using Opencv and Tensorflow c++