c – 协议缓冲区的静态链接导致与现有符号冲突

我们正在尝试为C运行时实现Protocol Buffers格式(ONNX)导入程序.我们的运行时将由前端应用程序使用,前端应用程序也使用Protocol Buffers模型.

当尝试执行运行前端和后端组件的进程时,我们看到错误表明符号名称与现有符号冲突.

[libprotobuf ERROR google/protobuf/descriptor_database.cc:109] Symbol name "onnx.AttributeProto" conflicts with the existing symbol "onnx.AttributeProto".
[libprotobuf FATAL google/protobuf/descriptor.cc:1164] CHECK failed: generated_database_->Add(encoded_file_descriptor, size):
terminate called after throwing an instance of 'google::protobuf::FatalException'
 what():  CHECK failed: generated_database_->Add(encoded_file_descriptor, size):
Aborted (core dumped)

有没有办法让两个组件(应用程序和共享对象)静态链接PB消息处理代码并在一个进程中注册相同的Protobuf符号?有没有办法告诉其他组件不要重新注册PB消息?

解决方法:

命名空间修改解决方案

Protocol Buffers拥有基于.proto文件名的全局注册表.当2个软件尝试将相同的PB消息添加到此注册表时,会出现名称冲突.

解决此问题的一种方法是人为地更改PB Message名称空间.您可以为PB消息定义不同的命名空间,并依赖CMakefile进行符号替换和重命名.

以下是onnx-tensorrt项目的示例:

https://github.com/onnx/onnx-tensorrt/blob/fa0964e8477fc004ee2f49ee77ffce0bf7f711a9/CMakeLists.txt#L92-L97

上一篇:pytorch模型部署在MacOS或者IOS


下一篇:OpenVINO 是啥?Open Visual Inference & Neural Network Optimization