我们正在尝试为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项目的示例: