该程序是针对 Protocol Buffer 运行时库的 2.6.1 版本编译的,该版本与已安装的版本 (3.5.0) 不兼容

Posted

技术标签:

【中文标题】该程序是针对 Protocol Buffer 运行时库的 2.6.1 版本编译的,该版本与已安装的版本 (3.5.0) 不兼容【英文标题】:This program was compiled against version 2.6.1 of the Protocol Buffer runtime library, which is not compatible with the installed version (3.5.0) 【发布时间】:2019-05-21 09:15:27 【问题描述】:

当我将可执行文件和 lib 依赖项复制到另一台计算机并运行程序时,我收到此错误:

。联系程序作者获取更新。如果您自己编译程序,请确保您的标头来自与链接时库相同的 Protocol Buffers 版本。

此错误仅发生在新计算机中。我可以在我的电脑上运行我的程序,没有任何问题。

我尝试使用ldd -dobjdump -p engine | grep NEEDED 检查哪些库中有 protobuf,但我找不到它们。

我的程序使用:opencv with Cuda、boost、tensorflow、tensorRT。

这两款电脑操作系统都是 Ubuntu 16.04.6 LTS。

我怎样才能找到与此冲突有关的部分?

我尝试通过添加 -DBUILD_PROTOBUF=OFF -DPROTOBUF_UPDATE_FILES=ON -DPROTOBUF_INCLUDE_DIR=/usr/include -DPROTOBUF_LIBRARY=/usr/lib/x86_64-linux-gnu/libprotobuf.so 重新编译没有 protobuf 的 opencv。

这并没有解决问题。

【问题讨论】:

不要将二进制文件从一台计算机复制到另一台计算机。如果您在新计算机上重新编译可执行文件,您的运气会更好。可以移动二进制文件,但移动源文件要容易得多。你为什么要重新编译 OpenCV? Ubuntu 不是已经提供了吗? 我必须复制所有二进制文件,我无法在另一台计算机上重新编译我的程序需要是可移植的,这样我才能在任何其他计算机上“重新安装”它 二进制文件通常不可移植,源代码可以。只有当所有它使用的库具有兼容版本并且使用兼容选项编译时,您才能将可执行文件移动到另一台计算机。为了确保所有内容都是相同的版本,您可以将所有内容都放入一个容器中,然后在另一台机器上使用它。但正如我所说,重新编译要容易得多,只需在目标机器上运行构建/安装脚本(或 Makefile)。因为你确实有这样的脚本/Makefile,不是吗? 是的,我的项目有 cmake,但我还需要下载编译并安装所有依赖项(boost、TensrRT、Tensorflw、opencv、....),这就是我想要的避免 我尝试在新计算机上重新编译所有代码+依赖项,但仍然出现相同的错误。我做错了什么? 【参考方案1】:

您有两个不同的版本libprotobuf,其中一个通过动态库安装在/usr/local/lib/

但是当你构建你的程序时,你会包含其他版本的libprotobuf

你可以重新安装libprotobuf来解决这个问题。

如果您从源代码安装 libprotobuf,请确保添加了标志 -Dprotobuf_BUILD_SHARED_LIBS=ON

【讨论】:

对不起,我检查并找到了libprotoc10: /usr/lib/x86_64-linux-gnu/libprotoc.so.10 libprotoc10: /usr/lib/x86_64-linux-gnu/libprotoc.so.10.0.0。我应该删除哪个以及如何重新安装 libprotobuf?

以上是关于该程序是针对 Protocol Buffer 运行时库的 2.6.1 版本编译的,该版本与已安装的版本 (3.5.0) 不兼容的主要内容,如果未能解决你的问题,请参考以下文章

「Protocol Buffer」之PB在gRPC中的应用

Google Protocol Buffer 协议

在NodeJS中玩转Protocol Buffer

Mac下安装protocol buffer编译错误

后端程序员之路 39一个Protocol Buffer实例

protocol buffer的service接口生成问题