1

我对共享库有以下问题

创建共享库

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

我怎么解决这个问题

4

1 回答 1

0

运行时加载库的加载,尤其是重新加载语义是平台和实现特定的。最好不要依赖任何类型的全局状态,而是将显式初始化函数传递给您的库。也许像这样:

library_context_t context;

/* dlopen, dlsym, ... */

library_init(&context);

library_do_thing(&context);

// ...

library_destroy(&context);

// maybe unload, or reuse

特别是 Linux不会重新加载已经加载的库。

于 2012-09-05T09:41:38.820 回答