该程序是针对 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 -d
和objdump -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) 不兼容的主要内容,如果未能解决你的问题,请参考以下文章