【发布时间】:2021-08-28 20:15:39
【问题描述】:
我有一个使用Google Protobuf2 的项目。现在我想使用通过 CMake 集成的预构建 tensorflow C-API。但现在我收到以下错误:
libprotobuf FATAL google/protobuf/stubs/common.cc:61] 这个程序需要 3.9.0 版本的 Protocol Buffer 运行时库,但安装的版本是 2.6.1。请更新您的图书馆。如果您自己编译程序,请确保您的标头来自与链接时库相同的协议缓冲区版本。 (“bazel-out/k8-opt/bin/tensorflow/core/framework/tensor_shape.pb.cc”中的版本验证失败。) 在抛出 'google::protobuf::FatalException' 的实例后调用终止 what():这个程序需要3.9.0版本的Protocol Buffer运行库,但是安装的版本是2.6.1。请更新您的图书馆。如果您自己编译程序,请确保您的标头来自与链接时库相同的协议缓冲区版本。 (“bazel-out/k8-opt/bin/tensorflow/core/framework/tensor_shape.pb.cc”中的版本验证失败。)
有没有简单的方法来解决它? Tensorflow 不与项目的其余部分交换任何消息,所以我可以保留两个版本吗?降级 tensorflow proto 是不可能的,因为它是一个预构建的库。将项目的其余部分升级到 proto3 也需要付出很多努力。我可以只使用 proto 3.9.0 并将 syntay="proto2" 添加到所有旧的 proto 文件吗?
【问题讨论】:
-
在最坏的情况下,您也许可以使用
dlopen和RTLD_LOCAL来相互“隐藏”库。不过,这很痛苦,因为您必须手动访问绑定您使用的每个符号;如果您实际上dlopen您自己应用程序的另一部分,这可能是最简单的,这样您就可以简化边框。 -
@o11c 我认为您的解决方案是正确的!你能告诉我在哪里以及如何使用 dlopen() 吗?
-
你读过
dlopenman page吗? (请注意,dlmopen并不能真正帮助您;当您需要多个库相互了解但不了解其他库集时,它很有用)。使用x macros(单独的文件版本更合理)来维护要跨库边界导入的符号集可能很有用,如果这是您自己的事情,这会容易得多,但不是绝对必要的。 -
@o11c 是的,只是有一点我不明白的词汇。所以就我而言:我有 tensorflor-c-api 由一些标头和一些二进制文件 (.so) 组成。不,我有一个 c++ 包装器可以在我的包中使用 tensorflow-C-Api。现在我必须在哪里加载动态共享对象?在我的 cpp-wrapper 标头中?而且我真的需要将 handlerto 放在每个使用 tensorflow 函数的函数之前吗?
标签: c++ cmake protocol-buffers catkin