Pregunta

Tengo una aplicación que está utilizando una biblioteca estática que hice. Un archivo .cpp en la biblioteca tiene una declaración de variable estática, cuya ctor llama a una función en un producto único que hace algo: por ejemplo, agrega una cadena.

Ahora cuando uso esa biblioteca de la aplicación, no parece mi Singleton para contener cualquier rastro de la cadena que se suponía iba a ser añadido.

definitivamente estoy perdiendo algo, pero no sé qué ..

¿Fue útil?

Solución

Si usted tiene un objeto en una biblioteca estática que no es EXPLICITAMENTE se utiliza en la aplicación. A continuación, el enlazador no se tire de ese objeto de la lib en la aplicación.

Hay una gran diferencia entre las bibliotecas estáticas y dinámicas.

Dynamic Library:
Al compilar nada se tira de la biblioteca dinámica. se añade código adicional para cargar explícitamente y resolver los símbolos en tiempo de ejecución. En tiempo de ejecución se carga toda la biblioteca y por lo tanto los inicializadores de objeto se llaman (aunque cuando es detalle de implementación).

Las librerías estáticas se manejan de manera muy diferente:
Al vincular con una biblioteca estática que tira de todos los elementos que no están definidos en la aplicación que se definen en la biblioteca en la aplicación. Esto se repite hasta que no hay más dependencias que la biblioteca pueda resolver. El efecto secundario de esto es que los objetos / funciones que no se utilizan de forma explícita no se tira de forma de la biblioteca (variables por lo tanto globales que no se accede directamente no será tirado).

Otros consejos

Mi memoria de esto es un poco confusa, pero que podría estar siendo golpeado con un problema de orden de inicialización. No hay garantías en qué orden inicializadores variable estática en diferentes archivos de ser llamado, así que si su Singleton no se ha iniciado aún cuando se inicializa la variable estática en la biblioteca, que podrían producir el efecto que se está viendo.

La forma en que he recibido en torno a estos problemas es tener algún tipo de función init explícita que hace estas cosas y que llamo al comienzo de main o algo así. Usted puede ser capaz de jugar con el orden en que se da al archivo objeto y los argumentos de la biblioteca para el compilador (o enlazador, en realidad), ya que también ha funcionado para mí, pero esa solución es un poco frágil, ya que depende no sólo sobre el uso del enlazador específico, sino probablemente también la versión específica.

Refactor los cursos realice la inicialización estática para que no depende de ningún otro tipo de clases. Es decir, hacer que la inicialización de cada clase independiente y autosuficiente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top