Можно ли статически связать то же сообщение protobuf в несколько DLLs - и затем иметь ли те DLLs, сотрудничают?

Мы используем Google protobufs для раздавания данных по проводу. Сторона сервера вещей подобна плагину, таким образом, несколько из модулей, обрабатывающих сообщения protobuf, являются DLLs. Некоторые DLLs зависят от других и используют, другие обмениваются сообщениями для определения их собственных сообщений.

Так, A.DLL имеет a.proto который генерирует a.pb.h/cc с классом сообщений MsgA. Используя недокументированное dllexport_decl опция на protoc компиляторе, класс сообщений объявляется как экспорт DLL.

Теперь, B.DLL зависит от A.DLL, и b.proto также похож на это:

import "a.proto";
message b 
{
    required int32 some_number = 1;
    required PackageA.MsgA some_a = 2;
}

Наконец, исполняемый файл, который сплачивает части также, зависит от сообщения MsgA. protobuf библиотека была также создана как DLL и связана во все. Все это создает и работает.

Но, существуют Силы Света, которые потребовали, чтобы мы сократили распределение DLL! Так, я создал модуль (который является просто набором сообщений и маленького utils что большое другое сменное использование DLLs) как статическая библиотека вместо DLL. B.DLL и исполняемый файл и связываются с A, и все хорошо - до сих пор.

Так как A статически связан, MsgA полностью определяется во всем DLLs и EXE. Это в порядке, потому что все статические данные в сгенерированном коде C++ являются константой. Таким образом, что, если существует несколько копий в исполнительном приказе суда - все копии идентичны.

Но, когда я выполняю недавно созданный процесс, libproto выдает на самом деле полезное исключение - идентификатор файла MsgA уже существует в карте дескриптора (или что-то как этот). Другими словами, то, что существуют повторные определения для MsgA основная проблема.

Так, наконец, вот вопрос (вопросы):

  • Если бы мы статически связали libproto вместо того, чтобы использовать его в качестве DLL, то ошибка ушла бы?
  • Действительно безопасно иметь повторные определения MsgA рассеянный всюду по DLLs?

Первая точка, на которую я могу, вероятно, ответить сам через несколько дней, после того как я нахожу время для восстановления protobuf библиотек, но второй - немного далее вне моих современных знаний. Я также надеюсь разбудить быстрое или вниз ответить, что это может избавить меня от необходимости перекомпилировать первичное, освобождает.

7
задан Daver 24 February 2010 в 22:34
поделиться