我目前正在尝试在非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"中的版本验证失败。) 抛出' google :: protobuf :: FatalException'
的实例后终止调用what():此程序是针对Protocol Buffer运行时库的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"中的版本验证失败。) 放弃(核心倾销)
你能帮助我吗?
谢谢
答案 0 :(得分:4)
错误表明程序是使用protobuf 2.6.1中的标题(.h
文件)编译的。这些标头通常位于/usr/include/google/protobuf
或/usr/local/include/google/protobuf
中,但它们可能位于其他位置,具体取决于您的操作系统以及程序的构建方式。您需要将这些标头更新到3.1.0版并重新编译该程序。
答案 1 :(得分:3)
您应该使用链接描述文件重建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冲突。
(浪费了大量的时间,所以我希望它有所帮助!)
答案 2 :(得分: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/
现在,正在测试的可执行文件很酷。然而,不酷的是,如果没有从已将BACKUP路径添加到LD_LIBRARY_PATH的shell运行,gedit之类的东西就不再有用了:-(
希望有更好的解决方案吗?
答案 3 :(得分:0)
该错误抱怨协议缓冲区运行时库与安装的版本不兼容。该错误来自GTK3库。 GTK3使用协议缓冲区2.6.1。如果使用GTK3支持Opencv,则会出现此错误。解决此问题的最简单方法是,可以使用QT代替GTK3。
如果使用Cmake GUI安装Opencv,只需选择QT支持而不使用GTK3。您可以使用以下命令安装QT。
sudo apt install qtbase5-dev
答案 4 :(得分:0)
用 -Dprotobuf_BUILD_SHARED_LIBS=ON
重建 libprotobuf
然后 make install
覆盖旧版本