2012-04-25 11 views
5

Tengo dos "complementos" (piense en ellos solo como dos aplicaciones diferentes en un paquete de software para discusión) que se vinculan dinámicamente a dos versiones construidas por separado de mi biblioteca. Mi código está escrito en C++ y usa espacios de nombres consistentes en todo. A veces tengo que crear dos versiones diferentes de para cada aplicación. Esto parece causar algunos problemas cuando ambas aplicaciones (complementos) en el paquete se cargan simultáneamente. Primero necesito ayuda para entender por qué ocurre este error.Dos complementos que enlazan a archivos DLL idénticos u objetos de biblioteca compartidos (así) con implementación diferente (código)

Como ejemplo, tengo dos bibliotecas separadas pero de nombre idéntico, digamos mylib.so (o DLL) y cada aplicación está vinculando a (único) uno de estos. Si el código subyacente en mylib.so es el mismo (es decir, espacios de nombres, nombres de funciones, etc. con implementaciones ligeramente diferentes, por supuesto) ¿esto debería causar problemas? ¿No es el hecho de que las dos copias de las bibliotecas se encuentran en ubicaciones únicas suficientes para evitar cualquier problema que pueda surgir debido a la ambigüedad u otros errores de enlace? Creo que claramente no ... pero me gustaría saber de un experto en esto.

Suponiendo que la descripción anterior es lo que está causando el problema, simplemente se cambia el nombre de las bibliotecas para incluir por ejemplo alguna información de la versión, por ejemplo, mylib_v1.so y mylib_v2.so proporcionan una protección contra errores de ambigüedad (nombres de las funciones que subyace/espacios de nombres siendo aún idéntico) ? Todavía pienso que no ... pero no estoy seguro esta vez. Suponiendo que estoy en lo cierto, cambiar los espacios de nombres usando alguna macro en mi código para incluir información de la versión en los espacios de nombres (por ejemplo, namespace mystuff {} cambiado a namespace mystuff_v1) ¿hacer el truco al menos? Aprecia tus ideas

NOTA: ¡Sorprendentemente, la ambigüedad solo se produce en Windows! Linux es capaz de manejar la situación en el segundo párrafo sin ningún problema.

Respuesta

2

Si las aplicaciones solo utilizan una, y las PATH y LD_LIBRARY_PATH se configuran en para que no coincidan, no hay conflicto. Puede verlo con los cientos de archivos msvcrt.dll similares que una vez distribuidos con las aplicaciones, hasta que Microsoft resolvió eso.

Pero aún así, su código (ligeramente diferente) puede crear o hacer referencia a recursos globales y aquí puede ser la colisión. ¿Seguro que la variante de Windows no usa algo con nombre global, y introduce diferentes estructuras de datos aquí? (Archivo para almacenar configuraciones estándar, memoria compartida, ...). Como este material global depende en gran medida del sistema, tal vez hagas algo en Windows que no uses en Linux ...

Cuestiones relacionadas