2010-02-24 18 views
7

Estamos usando protobufs de Google para pasar datos por el cable. El lado del servidor de las cosas es similar a un plugin, por lo que varios de los módulos que manejan los mensajes protobuf son DLL. Algunas DLL dependen de otras y usan los mensajes de los demás para definir sus propios mensajes.¿Puede vincular estáticamente el mismo mensaje protobuf en varias DLL, y luego hacer que esas DLL funcionen juntas?

Entonces, A.DLL tiene a.proto que genera a.pb.h/cc con una clase de mensaje MsgA. Usando la opción dllexport_decl no documentada en el compilador de protocolos, la clase de mensaje se declara como una exportación de DLL.

Ahora, B.dll depende de A.dll y b.proto también tiene el siguiente aspecto:

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

Por último, el ejecutable que tira de las partes entre sí también depende del mensaje MsgA. La biblioteca protobuf también se creó como una DLL y está vinculada a todo. Todo se construye y se ejecuta.

Pero, hay Forces of Light que han exigido que reduzcamos la distribución DLL. Entonces, construí el módulo A (que es solo una colección de mensajes y pequeñas utilidades que usan muchas de las otras DLL de complementos) como una biblioteca estática en lugar de una DLL. B.DLL y el ejecutable se vinculan con A y todo está bien, hasta ahora.

Dado que A está estáticamente vinculado, MsgA se define por completo en todas las DLL y EXE. Eso está bien porque todos los datos estáticos en el código C++ generado son const. Entonces, ¿qué pasa si hay múltiples copias en el proceso final? Todas las copias son idénticas.

Pero cuando ejecuto el proceso recién creado, libproto arroja una excepción realmente útil: El ID de archivo de MsgA ya existe en el mapa de descriptor (o algo así). En otras palabras, el hecho de que haya múltiples definiciones para MsgAes un problema importante.

Así que, finalmente, aquí es la pregunta (s):

  • Si enlazado estáticamente el libproto en lugar de usarlo como un archivo DLL, iría el error de distancia?
  • ¿Es realmente seguro tener las múltiples definiciones de MsgA dispersas en las DLL?

El primer punto en el que probablemente pueda responderme en unos pocos días una vez que esté a punto de reconstruir las bibliotecas de protobuf, pero el segundo es un poco más allá de mi conocimiento actual. También espero obtener una respuesta rápida de arriba hacia abajo que me ahorre el problema de volver a compilar las bibliotecas de protocolos.

+0

No puedo responder la pregunta, pero tu referencia a "dllexport_decl" me ha ayudado. ¡Gracias! –

+0

Encontré exactamente el mismo problema y no encontré una buena solución. Me interesa si alguien puede proporcionar uno. –

+0

https://groups.google.com/forum/#!msg/protobuf/bp1YbXqN4rE/dwEb4q9WqzsJ Parece que este hilo trata sobre el mismo problema. –

Respuesta

1

He usado protobuffers para RPC en una red (Google también lo hace - vea la página de documentación). Siempre que tenga una definición similar para todos los que usen el búfer de proto, una definición deserializará datos serializados por otras definiciones. De hecho, siempre que no reasigne los números de las etiquetas, las versiones anteriores de la definición del búfer de protocolo pueden interactuar con las versiones más recientes sin problemas (siempre que existan campos "requeridos" en la definición de deserialización en la secuencia, tener éxito).

Espero que ayude.

Cuestiones relacionadas