Fino a qualche tempo fa, pensavo che una libreria statica fosse solo una raccolta di file .o oggetto, semplicemente archiviandoli e non rendendoli gestiti diversamente. Ma il collegamento con un oggetto .o e il collegamento con una libreria .a statica contenente questo oggetto .o non sono apparentemente lo stesso. E io non capisco perché ...Inizializzazione statica e distruzione di globals di una libreria statica non avvenuta con g ++
Prendiamo in considerazione i seguenti file di codice sorgente:
// 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;
Facciamo compilare ed collegamento ed eseguire questo codice:
g++ -Wall object.cpp main.cpp -o main1
./main1
> Object constructor called
> main
> Object destructor called
Il costruttore viene chiamato il distruttore dell'oggetto globale gObject.
Ora creiamo una libreria statica dal nostro codice e utilizzare (link) in un altro programma:
g++ -Wall -c object.cpp main.cpp
ar rcs lib.a object.o
g++ -Wall -o main2 main.o lib.a
./main2
> main
- costruttore e distruttore di GObject non sono chiamati ... perché?
- Come chiamarli automaticamente?
Grazie.
Grazie. Sembra che il collegamento con tutti i file .o contenuti in una .a possa essere forzato usando l'opzione linker -Wl, - whole-archive (o -Wl, -all_load su MacOSX) ... – moala
Vedi anche -force_load per MacOSX – moala
Ci saranno problemi se entrambi '1.o' e' 2.o' di 'some.a' hanno due variabili globali con lo stesso nome? Possono essere collegati in un unico eseguibile (considerare i casi: il globale è riferito/non riferito dall'eseguibile)? –