C ++,全局变量和动态共享库

时间:2014-04-04 22:01:13

标签: c++ linux global-variables shared-libraries

全局变量很糟糕我知道,但即使是函数本地的静态似乎也很糟糕。

我注意到在linux上,第一次使用dlopen时初始化共享对象(动态库)中的全局和静态。但是当你关闭,然后重新开始时,它不会第二次初始化全局或静态。

我使用带有dlopen的RTLD_NOLOAD来测试dlclose是否实际删除了libary,它说它有,所以这不是引用计数问题。

这与windows不同: http://msdn.microsoft.com/en-us/library/988ye33t.aspx 我已经测试过,似乎重新初始化静态。

这是真的吗,还是我只是弄乱别的东西?

如果这是真的,那么这会使任何类型的静态变量变得危险/无用吗?

1 个答案:

答案 0 :(得分:2)

  

但是当你关闭,然后重新开始时,它不会第二次初始化全局或静态。

这很有可能发生,因为dlclose上的库实际上 已卸载。

来自man dlclose

The function dlclose() decrements the reference count on the dynamic library
handle handle. If the reference count drops to zero and no other loaded
libraries use symbols in it, then the dynamic library is unloaded.

很可能你没有满足"没有其他加载的库在其中使用符号"一部分。

您可以使用LD_DEBUG=symbols,bindings运行二进制文件,并观察以下消息:

    binding file XXX to libYYY.so: normal symbol `ZZZ'

如果您将libYYY.so中的任何符号绑定到卸载的文件,则无法在libYYY.so上卸载dlclose。< / p>