Мы используем 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
основная проблема.
Так, наконец, вот вопрос (вопросы):
MsgA
рассеянный всюду по DLLs?Первая точка, на которую я могу, вероятно, ответить сам через несколько дней, после того как я нахожу время для восстановления protobuf библиотек, но второй - немного далее вне моих современных знаний. Я также надеюсь разбудить быстрое или вниз ответить, что это может избавить меня от необходимости перекомпилировать первичное, освобождает.