Динамическое связывание protobuf: файл уже существует в базе данныхC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Динамическое связывание protobuf: файл уже существует в базе данных

Сообщение Anonymous »

У меня есть проект, который динамически загружает два общих объекта. Оба компилируют разные файлы прототипа, которые импортируют один и тот же файл common.proto.
При загрузке второго я получаю:

Код: Выделить всё

[libprotobuf ERROR ../../src/src/google/protobuf/descriptor_database.cc:642] File already exists in database: common.proto
Вот мой тестовый проект, демонстрирующий это: https://github.com/KUGA2/proto_multi
Обе библиотеки (моя и другие) идентичны. Они просто компилируют прототипы (и имеют функции link_my/other() для принудительного связывания)
Затем я собираю динамический.cpp в исполняемый файл (без каких-либо ссылок в CMake). Он использует dlopen для загрузки обеих библиотек.
Запуск дает:

Код: Выделить всё

proto_multi/0.1 (test package): RUN: dynamic_linking
libother.so loaded!
[libprotobuf ERROR ../../src/src/google/protobuf/descriptor_database.cc:642] File already exists in database: common.proto
[libprotobuf FATAL ../../src/src/google/protobuf/descriptor.cc:1986] CHECK failed: GeneratedDatabase()->Add(encoded_file_descriptor, size):
terminate called after throwing an instance of 'google::protobuf::FatalException'
what():  CHECK failed: GeneratedDatabase()->Add(encoded_file_descriptor, size):
Aborted (core dumped)
Поэтому я не могу загрузить второй.
Я понимаю, что обе библиотеки скомпилировали common.proto, и существует какая-то статическая процедура инициализации, которая выдает эту ошибку.
Как я могу это исправить? Я не могу изменить «другую» библиотеку, только «свою» библиотеку и исполняемый файл. Но обе библиотеки должны загружаться динамически. Могу ли я добавить пространство имен, чтобы исправить это? Могу ли я отключить базу данных дескрипторов? (Я не думаю, что мне нужно отражение.)
PS: при использовании статического связывания все работает нормально.
PPS: использование protobuf-lite не вариант, поскольку нам нужен grpc.

Подробнее здесь: https://stackoverflow.com/questions/798 ... n-database
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»