Статическое связывание буферов протокола приводит к конфликтам с существующими символами

Мы пытаемся реализовать импортер формата Protocol Buffers (ONNX) для среды выполнения C ++. Наша среда выполнения будет использоваться внешними приложениями, которые также используют модели протоколов буфера.

При попытке выполнить процесс, который запускает как внешний, так и внутренний компоненты, мы видим ошибки, указывающие на то, что имя символа conflicts with the existing symbol,

[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?

4

Решение

Решение искажения пространства имен

Протокол Buffers содержит глобальный реестр, основанный на .proto имя файла. Когда 2 компонента программного обеспечения пытаются добавить одно и то же сообщение PB в этот реестр, возникает конфликт имен.

Одним из способов обойти это является искусственное изменение пространства имен PB Message. Вы можете определить другое пространство имен для вашего сообщения PB и использовать CMakefile для замены и переименования символов.

Вот пример из onnx-tensorrt проект:

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

0

Другие решения

Связывание буферов протокола статически

Протокол Buffers содержит глобальный реестр, основанный на .proto имя файла. Когда 2 компонента программного обеспечения пытаются добавить одно и то же сообщение PB в этот реестр, возникает конфликт имен.

Одним из способов обойти это является статическая привязка всей библиотеки Protocol Buffers к вашему проекту. Это эффективно создает отдельный реестр, в котором могут быть зарегистрированы сообщения PB.

Вот пример из ngraph проект:

https://github.com/NervanaSystems/ngraph/commit/3d664abd7b8cc8295b6da79689f9bf119d55a2dd

0

По вопросам рекламы [email protected]