Se vuoi che il tuo codice sia portabile dovresti probabilmente provare qualcosa del genere:
namespace {
struct initializer {
initializer() {
std::cout << "Loading the library" << std::endl;
}
~initializer() {
std::cout << "Unloading the library" << std::endl;
}
};
static initializer i;
}
In C++ sotto Linux, le variabili globali verranno costruite automaticamente non appena la libreria viene caricata. Quindi questo è probabilmente il modo più semplice per procedere.
Se hai bisogno di una funzione arbitraria da chiamare quando la libreria viene caricata, usa l'attributo costruttore per GCC:
__attribute__((constructor)) void foo(void) {
printf("library loaded!\n");
}
Le funzioni di costruzione vengono chiamate dal linker dinamico quando viene caricata una libreria. Questo è in realtà il modo in cui viene implementata l'inizializzazione globale C++.