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.