c - 共享库中的静态变量

标签 c static linker shared-libraries

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

最佳答案

Suma 的回答是正确的。静态变量只有一个实例。这也是为什么在共享库中使用静态全局变量会是一个大问题。一个可能发生这种情况的真实示例:

  • Apache 加载以下模块的网络服务器:
    • mod_php 链接到
      • libxml2
    • mod_perl 加载
      • libxml2

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

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

关于c - 共享库中的静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21983684/

相关文章:

c++ - 运行程序时找不到共享对象库,但在编译过程中已链接

c++ - QuantLib 链接器错误:QuantLib::Error::Error()

c - Id 返回 1 退出状态 - 文件读取

我可以更改之前在 C 中声明的变量的数据类型吗?

c - 没有锁的一插入多读列表安全吗?

java - 如何使用静态成员泛化 Java 枚举?

java - 访问线程以从另一个方法通知它(Android 应用程序)

c++ - 区别 SAFE_RELEASE(), SAFE_DELETE()

python - 什么时候在 Python 中初始化类变量?

c++ - 将静态库链接到其他静态库