我对共享库有以下问题
创建一个共享的libraray
class A
{
static int callCount;
A() { callCount++; }
}
int A:callCount = 0;
class Main
{
Main()
{
A a1();
A a2();
}
}
现在创建一个正在加载此共享库的过程更多次,我希望callCount只属于共享库而不属于整个过程
dlopen("shared.so", RTLD_LAZY);
// after some code i can construct Main()
// and now i will open the shared object again
dlopen("shared.so", RTLD_LAZY);
// now if i construct Main from the new library i want to have a new
// initialized callCount eq 0 but its 2
我该如何解决这个问题
答案 0 :(得分:0)
运行时加载的库的加载,尤其是重新加载语义是非常平台和特定于实现的。最好不要依赖任何类型的全局状态,而是将显式初始化函数传递给库。也许是这样:
library_context_t context;
/* dlopen, dlsym, ... */
library_init(&context);
library_do_thing(&context);
// ...
library_destroy(&context);
// maybe unload, or reuse
Linux特别是不重新加载已加载的库。