考虑以下代码,用于在 linux 上使用 g++-4.7 构建的动态加载库,-fPIC
并与-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(); }
对我来说有趣/烦人的部分是 library_fini() 在我调用之后没有被调用lt_dlclose
,所以它似乎对最终确定毫无用处,因为当我在运行期间加载这个模块时,Wrapper
实例的析构函数发生在调用之前library_fini
。不用说,这种默认行为没有任何意义。
我该如何改变这种无意义的行为?我需要在我的库完成例程中完成我的静态数据。为什么lt_dlclose
不调用library_fini()
?