编译caffe 多版本protoc冲突

博主手贱删除之前编译好的caffe后重新编译,因安装anaconda后protoc3.6.1与之前的protoc2.5冲突出现错误。博主进行了三次尝试,先注释.bashrc里anaconda变量、再修改Makefile中protoc版本,编译均不通过,最后编译protoc2.6.1成功。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

手贱把之前编译好的caffe给删了,得重新编译,但是发现出现了各种错误,主要就是因为安装了anaconda后,有一个protoc3.6.1的存在,和自己之前编译安装的protoc2.5有冲突。

处理过程
1.尝试一:
将.bashrc里关于anaconda的变量先注释掉,叫上protoc2.5的:

#protobuf 2.5
export PATH=/usr/local/pro-2.5/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/pro-2.5/lib:$LD_LIBRARY_PATH
export PKG_CONFIG_PATH==/usr/local/pro-2.5/lib/pkgconfig:$PKG_CONFIG_PATH
#end

这时候通过protoc --version可以看到版本已经变成了2.5,然而编译还是不通过。
2.尝试二:
修改Makefile中protoc的版本:
找到protoc相应位置,修改为如下

    @ echo PROTOC $<
    $(Q)/usr/local/pro-2.5/bin/protoc --proto_path=$(PROTO_SRC_DIR) --cpp_out=$(PROTO_BUILD_DIR) $<

$(PY_PROTO_BUILD_DIR)/%_pb2.py : $(PROTO_SRC_DIR)/%.proto \
        $(PY_PROTO_INIT) | $(PY_PROTO_BUILD_DIR)
    @ echo PROTOC \(python\) $<
    $(Q)/usr/local/pro-2.5/bin/protoc --proto_path=src --python_out=python $<

之前caffe编译成功就是通过这种方式,然后编译还是不通过。

3.尝试三:编译protoc2.6.1

下载protoc2.6.1,运行./autogen.sh时因为电脑没有翻墙,会出现下载不了的情况,参考这个解决

$cd /usr/local/include/google
$sudo rm -rf protobuf
$ ./autogen.sh
$ ./configure --prefix=/usr/local/pro-2.6.1
$ make
$ make check
$ sudo make install
$ sudo ldconfig

然后可以正确编译通过(并没有去修改~~/.bashrc和Makefile就通过了,还是用的protoc2.5,安装protoc2.6.1时,重新生成了/usr/local/include/google中文件,可能是这个原因导致的版本冲突)

<think>好的,我现在需要解决用户在编译OpenPose时遇到的关于google::protobuf::io::CodedInputStream::SetTotalBytesLimit函数调用的错误。首先,我应该了解这个错误的具体原因是什么。用户提到的是编译错误,所以可能是函数调用方式与当前使用的Protobuf版本不兼容。 首先,回忆一下Protobuf的版本更新情况。我记得在Protobuf的更新历史中,某些函数可能在较新的版本中被弃用或更改了参数。例如,SetTotalBytesLimit这个函数可能在旧版本中有不同的参数要求。用户可能在编译时使用的Protobuf版本与OpenPose所依赖的版本不一致,导致函数调用错误。 接下来,查阅相关文档或社区讨论。根据引用[2]中的情况,M1芯片用户遇到protoc版本兼容性问题,需要指定x86_64版本。虽然用户的问题不同,但可能同样涉及Protobuf的版本兼容性问题。用户可能需要检查他们安装的Protobuf版本,并确认OpenPose是否支持该版本。如果版本过高,可能需要降级Protobuf到兼容的版本。 另外,错误信息可能指出函数调用的参数数量或类型不匹配。例如,SetTotalBytesLimit在较新的Protobuf版本中可能需要两个参数,而旧代码可能只传递了一个参数。这时候需要修改源代码,调整函数调用的参数,以符合当前Protobuf版本的要求。 查看用户提供的引用[3],其中提到合并代码时可能需要处理冲突,所以用户可能在合并或修改代码时引入了这个问题。需要检查OpenPose的代码库中是否有关于Protobuf版本兼容性的已知问题,或者是否有补丁可用。例如,某些开源项目会在其GitHub issues中记录类似的问题和解决方案。 可能的解决步骤包括: 1. 确认当前安装的Protobuf版本。 2. 查看OpenPose的官方文档或GitHub仓库,确认支持的Protobuf版本。 3. 如果版本不匹配,降级或升级Protobuf到适当版本。 4. 检查代码中调用SetTotalBytesLimit的地方,确认参数是否符合当前Protobuf版本的函数签名。 5. 如果有必要,修改OpenPose的源代码,调整函数调用方式。 6. 重新编译并测试是否解决错误。 此外,可能需要处理依赖项之间的兼容性问题,例如gRPC或其他使用Protobuf的库是否也需要相应调整版本。在引用[2]中,用户通过指定x86_64的版本来解决兼容性问题,这可能适用于跨架构编译的情况,但当前问题更可能与函数参数有关。 总结,用户需要检查Protobuf版本与代码的兼容性,必要时修改代码或Protobuf版本,确保函数调用正确。同时,参考社区已有的解决方案或补丁可能加快问题解决。</think>### 解决OpenPose编译时`SetTotalBytesLimit`函数调用错误的方法 #### 问题原因 该错误通常是由于Protobuf库的版本与OpenPose代码不兼容导致的。在Protobuf的更新中,`SetTotalBytesLimit`函数的参数要求发生了变化。例如: - **Protobuf 3.12+**:要求调用时传入两个参数,即`SetTotalBytesLimit(int total_bytes_limit, int warning_threshold)`。 - **旧版本**(如Protobuf 3.11及以下):可能仅需一个参数`SetTotalBytesLimit(int total_bytes_limit)`。 若代码基于旧版本编写,而当前安装的Protobuf版本较新,会导致参数不匹配的编译错误[^1]。 #### 解决步骤 1. **确认Protobuf版本** 执行以下命令查看当前版本: ```bash protoc --version ``` 如果版本为**3.12或更高**,则需要修改代码。 2. **修改OpenPose源代码** 在代码中搜索`SetTotalBytesLimit`的调用位置(通常位于`.proto`文件生成的代码或第三方依赖中),将单参数调用改为双参数。例如: ```cpp // 原始代码(旧版本) coded_stream->SetTotalBytesLimit(1024 * 1024 * 1024); // 修改后(新版本) coded_stream->SetTotalBytesLimit(1024 * 1024 * 1024, 1024 * 1024 * 1024); ``` 3. **降级Protobuf版本(可选)** 若不想修改代码,可降级到兼容的版本(如3.11.x): ```bash # 卸载当前版本 sudo apt-get remove libprotobuf-dev protobuf-compiler # 安装指定版本(以3.11.4为例) wget https://github.com/protocolbuffers/protobuf/releases/download/v3.11.4/protobuf-cpp-3.11.4.tar.gz tar -xzf protobuf-cpp-3.11.4.tar.gz cd protobuf-3.11.4 ./configure make sudo make install ``` 4. **重新编译OpenPose** 清理之前的编译缓存后重新编译: ```bash cd openpose/build make clean make -j$(nproc) ``` #### 其他注意事项 - **依赖一致性**:若使用gRPC或TensorFlow等依赖Protobuf的库,需确保它们的版本与Protobuf兼容[^2]。 - **M1芯片兼容性**:若在M1设备上编译,可能需要通过Rosetta模拟x86环境,或手动指定架构(参考引用[2]的方法)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值