TensorFlow 2.13.0 C++推理测试遇Protobuf致命错误求助
解决Slackware下TensorFlow C++ API运行时Protobuf重复描述符错误
错误原因
该错误是由于Protobuf描述符数据库重复添加了tensorflow/compiler/xla/service/cpu/xla_framework.proto文件的描述信息,通常是Protobuf库版本冲突或重复链接不同实例的Protobuf库导致的——Ubuntu 22.04默认的Protobuf版本与TensorFlow 2.13.0编译依赖的版本匹配,因此未触发该问题。
解决方法
1. 校验Protobuf版本一致性
- 查看系统自带Protobuf版本:
protoc --version - TensorFlow 2.13.0默认依赖Protobuf 3.21.9,若系统版本与该版本不符,需二选一:
- 重新编译TensorFlow,适配系统当前的Protobuf版本;
- 替换系统Protobuf为3.21.9版本(注意:替换系统库可能影响其他依赖Protobuf的程序)。
2. 编译TensorFlow时强制使用动态Protobuf库
编译TensorFlow时若静态链接了Protobuf,会与系统动态Protobuf库产生冲突,需添加编译参数强制使用动态库:
bazel build --define=protobuf_use_dynamic_library=true //tensorflow:libtensorflow_cc.so //tensorflow:libtensorflow_framework.so
重新编译TensorFlow C++ API后再测试。
3. 修正测试程序的编译链接配置
检查测试程序的编译脚本(如CMakeLists.txt),确保只链接TensorFlow自带的Protobuf库,避免同时链接系统Protobuf库:
- 示例CMake配置:
find_package(TensorFlow REQUIRED) add_executable(inference_test inference_test.cpp) target_link_libraries(inference_test ${TensorFlow_LIBRARIES})
4. 清理编译缓存
清理TensorFlow和测试程序的旧编译缓存,避免残留的冲突文件:
# 清理TensorFlow的Bazel缓存 bazel clean --expunge # 清理测试程序的编译目录 rm -rf build && mkdir build && cd build
之后重新编译测试程序。
内容的提问来源于stack exchange,提问作者NickF_93
相关产品推荐
相关产品推荐

