共享库中的静态变量

时间:2014-02-24 09:31:28

标签: c static linker shared-libraries

我的问题是关于在共享库中创建的静态变量(static void *)(让我们调用这个库'S'),但它是一个未在外面显示的内部变量,但每次调用API都依赖于它。现在让我们考虑一个案例,当一个程序(让我们称之为主程序)链接到另外两个共享库,并且每个库都链接到库S.现在,我们的主程序的静态变量会发生什么?它有一个实例吗?两个?

3 个答案:

答案 0 :(得分:6)

Suma的回答是正确的。只有一个静态变量实例。这也是为什么在共享库中使用静态全局变量可能是一个巨大的问题。这可能发生的一个现实世界的例子:

  • Apache webserver,它加载以下模块:
      链接的
    • mod_php
      • 的libxml2
    • mod_perl 加载
      • 的libxml2

现在,如果某些PHP代码修改了 libxml2 中的解析器选项等全局设置,Perl代码也会看到这些更改。这可能导致非常难以诊断的错误。因此,您应该不惜一切代价避免共享库中的全局状态。

(使用 libxml2 ,您可以在当地进行大部分设置。)

答案 1 :(得分:3)

假设您的静态变量仅在一个翻译单元中定义,它只会存在一次,因为共享库只加载一次到该过程中。

如果使用sharedstatic链接的混合,这将变得更加困难。

答案 2 :(得分:0)

当你有几个具有相同名称的变量时,编译器会为每个全局静态变量甚至创建一个不同的实例。

实际上,编译器(或可能是预处理器)根据声明它的源文件的名称隐式更改每个这样的变量的名称。

您可以通过在头文件中声明全局静态变量来证明这一点,然后将此头文件包含在几个不同的源文件中。尝试在每个源文件中将其设置为不同的值,您将看到此变量在每个源文件中保留其不同的值。