Initialisation statique et destruction des globales d'une bibliothèque statique ne se produisant pas avec g ++

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

Question

Il y a quelque temps, j’imaginais qu’une bibliothèque statique était simplement une collection de fichiers objet .o, qu’il fallait simplement les archiver et ne pas les gérer différemment. Cependant, les liaisons avec un objet .o et avec une bibliothèque statique contenant cet objet .o ne sont apparemment pas les mêmes . Et je ne comprends pas pourquoi ...

Considérons les fichiers de code source suivants:

// 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;

Compilons et lions et exécutons le code suivant:

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

Le constructeur et le destructeur de l'objet global gObject sont appelés.

Créons maintenant une bibliothèque statique à partir de notre code et utilisons-la (lien) dans un autre programme:

g++ -Wall -c object.cpp main.cpp
ar rcs lib.a object.o
g++ -Wall -o main2 main.o lib.a
./main2
> main
  • Les constructeurs et destructeurs de gObject ne sont pas appelés ... pourquoi?
  • Comment les appeler automatiquement?

Merci.

Était-ce utile?

La solution

Les bibliothèques statiques

.a contiennent plusieurs .o , mais elles ne sont pas liées à moins que vous ne les référenciez à partir de l'application principale.
.o fichiers lien permanent toujours.

Les fichiers .o de l'éditeur de liens sont donc toujours référencés, mais les fichiers .a sont toujours référencés. Les fichiers objet .o sont liés.

Comme remarque, il n'est pas nécessaire que les objets globaux statiques soient initialisés avant que vous ne fassiez référence à quoi que ce soit dans l'unité de compilation. La plupart des compilateurs initialisent tous ces objets avant le programme principal. Cependant, la seule condition requise l'unité de compilation est exécutée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top