当前位置: 首页 > 知识库问答 >
问题:

使用Opencv和Tensorflow c时冲突Protobuf版本

宦宏爽
2023-03-14

我目前正试图在一个非bazel项目中使用Tensorflow的共享库,所以我创建了一个。所以使用bazel从tensorflow归档。

但当我启动一个同时使用Opencv和Tensorflow的c程序时,它会让我产生以下错误:

[libprotobuf FATAL external/protobuf/src/google/protobuf/stubs/common.cc:78]此程序是根据协议缓冲区运行库的2.6.1版编译的,该版本与安装的版本(3.1.0)不兼容。联系程序作者以获取更新。如果您自己编译了该程序,请确保您的头文件来自与链接时间库相同版本的协议缓冲区。(版本验证在“/build/mir-pkdHET/mir-0.21.0 16.04.20160330/obj-x86_64-linux-gnu/src/protobuf/mir_protobuf.pb.cc”中失败。)在抛出“google::protobuf::FatalException”实例调用terminate

what():此程序是根据协议缓冲区运行库的2.6.1版本编译的,该版本与安装的版本(3.1.0)不兼容。联系程序作者以获取更新。如果您自己编译了该程序,请确保您的头文件来自与链接时间库相同版本的协议缓冲区。(版本验证在“/build/mir-pkdHET/mir-0.21.0 16.04.20160330/obj-x86_64-linux-gnu/src/protobuf/mir_protobuf.pb.cc”中失败。)废弃(堆芯倾倒)

你能帮助我吗?

非常感谢。

共有3个答案

萧萧迟
2023-03-14

这确实是一个相当严重的问题!我得到了与您类似的以下错误:

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

现在,测试中的可执行文件可以运行了,很酷。然而,不酷的是,如果不从一个将备份路径添加到LD_LIBRARY_path的shell中运行,像gedit这样的东西就不再工作了:-(
希望有更好的解决方案?

黄逸清
2023-03-14

该错误表明该程序是使用protobuf 2.6.1中的头文件(.h文件)编译的。这些标题通常可以在/usr/include/google/protobuf/usr/local/include/google/protobuf中找到,尽管它们可能位于其他位置,具体取决于您的操作系统和程序的构建方式。您需要将这些头文件更新到3.1.0版本,然后重新编译程序。

乐正涵忍
2023-03-14

您应该使用链接器脚本重建TensorFlow,以避免在Bazel创建的共享库中使第三方符号成为全局性的。这就是TensorFlow的Android Java/JNI库如何能够与设备上预装的protobuf库共存(查看TensorFlow/contrib/Android中的构建规则以获得一个工作示例)

这里有一个BUILD文件,我改编自Android库,这样做:

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:
    *;
};

这将使tenorflow命名空间中的所有内容成为全局的,并且可以通过库获得,同时隐藏重置并防止它与原型冲突。

(在这件事上浪费了很多时间,所以我希望能有所帮助!)

 类似资料:
  • 我有一些问题与安装OpenCV与conrib模块从源代码和原型库。 我有一个程序,需要Protobuf3.1。以及带有contrib模块的OpenCV 3.2。在从源代码编译和安装这两个程序之后,程序本身编译和链接良好。在执行程序时,我得到以下错误: 此程序是针对2.6.1版本的协议缓冲区运行库编译的,该版本与安装的版本(3.1.0)不兼容。联系程序作者进行更新。如果您自己编译程序,请确保您的标头

  • 问题内容: 我意识到我的一个项目使用slf4j 1.5.8,而Hibernate使用slf4j 1.6。在使用Maven进行构建时,它会下载两个jar,但是我猜想使用了1.5.8的类文件。因此,当我运行程序时,出现以下错误: 在我把 1.5.8是依赖项的一部分,因此可以单独下载。 问题答案: 您发现自己时,有两个库(Hibernate和其他一些库)以两个不同的版本可传递地导入SLF4J。不幸的是,

  • 问题内容: 作为测试项目,我使用wsdl和jax- ws创建了一个非常简单的WebService。如果客户端作为GlassFish中的Web应用程序部署,则客户端运行得很好,但是如果我直接在Eclipse中启动相同的(WebService-)代码,则会收到以下错误: 经过研究,我发现它与某些版本的库文件有一定关系。所以现在我的问题是,如何才能“修复” Eclipse Java执行以正确运行我的We

  • 关于如何解决此错误的建议,以便我可以使用最新版本的akka、akka streams和akka HTTP?谢了!

  • 从最近几天开始,protoc生成器正在使用github.com/grpc-ecosystem/grpc-gateway的v2版本生成代码。我想继续使用github。com/grpc生态系统/grpc网关v1.16.0。我无法删除导致冲突的v2版本。我试着离开围棋。mod,从$GOPATH清除。我想我的protoc生成器不能使用v1版本。请指导我如何同步grpc网关运行时包。 使用以下命令生成消息和

  • 我正在尝试使用Spring启动应用程序将图像上传到azure blob。我得到了下面的错误 2022-02-02 23:28:39【qtp1371397528-21】信息16824 c.a.c.i.jackson。JacksonVersion-信息:包版本:jackson annotations=2.12.4,jackson core=2.12.4,jackson databind=2.12.4,