Inicialización estática y destrucción de los globales de una biblioteca estática que no ocurre con g ++

StackOverflow https://stackoverflow.com/questions/1804606

Pregunta

Hasta hace algún tiempo, pensé que una biblioteca estática era solo una colección de archivos de objetos .o, solo los archivaba y no hacía que fueran manejados de manera diferente. Pero, al parecer, vincular con un objeto .o y vincularse con una biblioteca estática que contiene este objeto .o no es lo mismo . Y no entiendo por qué ...

Consideremos los siguientes archivos de código fuente:

// main.cpp
#include <iostream>
int main(int argc, char* argv[]) {
    std::cout << "main" << std::endl;
}

// object.hpp
#include <iostream>
struct Object
{
    Object() { std::cout << "Object constructor called" << std::endl; }
    ~Object() { std::cout << "Object destructor called" << std::endl; }
};

// object.cpp
#include "object.hpp"
static Object gObject;

Compilemos y enlace y ejecutemos este código:

g++ -Wall object.cpp main.cpp -o main1
./main1
> Object constructor called
> main
> Object destructor called

Se llama al constructor y al destructor del objeto global gObject.

Ahora creamos una biblioteca estática a partir de nuestro código y la usamos (enlace) en otro programa:

g++ -Wall -c object.cpp main.cpp
ar rcs lib.a object.o
g++ -Wall -o main2 main.o lib.a
./main2
> main
  • El constructor y el destructor de gObject no se llaman ... ¿por qué?
  • ¿Cómo se les llama automáticamente?

Gracias.

¿Fue útil?

Solución

.a las bibliotecas estáticas contienen varias .o pero no están vinculadas a menos que las haga referencia a ellas desde la aplicación principal.
.o archiva el enlace independiente siempre.

Los archivos

So .o en el enlazador siempre van dentro, referenciados o no, pero desde los archivos .a solo se hace referencia a los archivos objeto .o están vinculados.

Como nota, no es necesario que los objetos globales estáticos se inicialicen hasta que realmente haga referencia a algo en la unidad de compilación, la mayoría de los compiladores los inicializarán todos antes de main, pero el único requisito es que se inicialicen antes de cualquier función de La unidad de compilación se ejecuta.

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