2009-03-27 20 views
7

Mi aplicación (C++, multiplataforma) está utilizando ampliamente las bibliotecas Boost (digamos la versión 1.x), y también quiero vincularme con un SDK de terceros (proveedor), utilizando el Boost (pero la versión 1.y).¿Pueden coexistir varias versiones de una misma DLL (Boost) en el mismo proceso?

Entonces, ambos nos vinculamos dinámicamente con nuestra propia versión de Boost DLL, siendo CRT idéntico. En consecuencia, en el tiempo de ejecución mi aplicación tendría que cargar ambas DLL de Boost 1.x & 1.y.

¿Cuáles son los posibles problemas relacionados con &?

No puedo cambiar el SDK del proveedor, pero puedo cambiar mi aplicación. Tal vez debería tratar de vincular estáticamente contra mi Boost 1.x?

PD: El nombre del archivo DLL Boost incluye su versión, por lo que no hay colisión de nombre, ambos son identificables. No es el usual DLL, demonios.

Respuesta

0

Si escribe una función foo, y la exporta desde F.dll, y otra función foo exportada desde G.dll, ¿espera problemas?

Cuando AF.exe está vinculado, se dice al enlazador: ponga allí algún código que cargue la dirección de la función foo de F.dll. Ahora BG.dll está vinculado para recuperar la dirección foo de G.dll. Todavía no veo ningún problema.

Ahora reemplace AF.exe con su aplicación, BG.dll con la aplicación de su proveedor, F.dll con su versión de refuerzo, G.dll con la versión de impulso del proveedor.

Concluyendo: no veo ningún problema si los nombres dll son diferentes.

2

En cuanto a usar las DLL para diferentes versiones no debería haber ningún problema. Al menos no en Windows.

Esto es cierto si el SDK está utilizando boost internamente. Si el SDK utiliza construcciones de impulso en su interfaz, por ejemplo: tiene una función que devuelve un impulso :: opcional, luego tener múltiples versiones puede causar problemas. Todavía podría funcionar bien, dependiendo de los cambios entre las versiones, pero definitivamente será un riesgo. No sé de ninguna buena solución en ese caso. Esto también es cierto si incluye un archivo de encabezado SDK que incluye un archivo de encabezado boost.

2

Esto es un gran problema. Haz una búsqueda en el infierno de DLL.

Básicamente, la DLL (o libs compartidas en Linux) se cargan pero no todos los nombres se resuelven en el momento de la carga. Lo que sucede es una evaluación perezosa, por lo que los nombres se evalúan en el primer uso. El problema es que si 2 dll tienen el mismo nombre, la ubicación donde se resuelve el nombre depende del orden en el que se busca la DLL (que depende del orden de carga).

Si enlaza estáticamente, no tendrá problemas con las llamadas a métodos, ya que las suyas se resolverán en tiempo de compilación y el tercero se resolverá en tiempo de ejecución desde la DLL. Pero ¿qué pasa con las estructuras creadas por la versión 1 de impulso? Si luego los pasa a la biblioteca de terceros que luego pasa a la versión x impulso. ¿Están las estructuras distribuidas de la misma manera?

Esta es un área muy complicada y cuando los problemas son muy difíciles de solucionar. Así que intente y use la misma versión.

Cuestiones relacionadas