При загрузке второго я получаю:
Код: Выделить всё
[libprotobuf ERROR ../../src/src/google/protobuf/descriptor_database.cc:642] File already exists in database: common.proto
Обе библиотеки (моя и другие) идентичны. Они просто компилируют прототипы (и имеют функции 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
Мобильная версия