Si vous voulez que votre code soit portable, vous devriez probablement essayer quelque chose comme ceci :
namespace {
struct initializer {
initializer() {
std::cout << "Loading the library" << std::endl;
}
~initializer() {
std::cout << "Unloading the library" << std::endl;
}
};
static initializer i;
}
En C++ sous Linux, les variables globales seront construites automatiquement dès que la bibliothèque sera chargée. C'est donc probablement la façon la plus simple de procéder.
Si vous avez besoin qu'une fonction arbitraire soit appelée lorsque la bibliothèque est chargée, utilisez l'attribut constructeur pour GCC :
__attribute__((constructor)) void foo(void) {
printf("library loaded!\n");
}
Les fonctions constructeur sont appelées par l'éditeur de liens dynamique lorsqu'une bibliothèque est chargée. C'est en fait ainsi que l'initialisation globale C++ est implémentée.