考慮使用g ++構建一個動態加載的庫下面的代碼之前調用 - 在Linux上,-fPIC
4.7與-rdynamic
選項鍊接:靜態變量的析構函數庫的析構函數
struct Wrapper
{
libraryUnregisterCbMap_t instance;
Wrapper() : instance() { HDebugLog("Wrapper CTOR!");}
~Wrapper() { HDebugLog("Wrapper DESTRUCTOR!"); }
};
inline libraryUnregisterCbMap_t& getLibraryUnregisterMap()
{
static Wrapper unregisterLibraryMap;
HDebugLog("getLibraryUnregisterMap: we have " <<unregisterLibraryMap.instance.size() << " elements. the address of the map is " << &unregisterLibraryMap.instance);
return unregisterLibraryMap.instance;
}
void registerLibrary(callbackContainer_t* p)
{
auto& map = getLibraryUnregisterMap();
}
void unregisterLibrary()
{
auto& map = getLibraryUnregisterMap();
}
void __attribute__ ((constructor)) library_init()
{
static callbackContainer_t cbContainer;
HDebugLog("Library constructor: address of static cbContainer is: " << &cbContainer);
registerLibrary(&cbContainer);
}
void __attribute__ ((destructor)) library_fini()
{ unregisterLibrary(); }
對我來說是有趣/惱人的是,我調用lt_dlclose
後沒有調用library_fini(),所以對於最終確定來說似乎沒用,因爲當我在運行期間加載此模塊時,Wrapper
實例的析構函數發生之前調用library_fini
。不用說,這種默認行爲沒有任何意義。
我該如何改變這種毫無意義的行爲?我需要在我的庫定稿例程中完成我的靜態數據。爲什麼lt_dlclose
未調用library_fini()
?