【发布时间】:2010-08-04 19:19:52
【问题描述】:
在 Linux 上,我有一些从定义全局变量的静态库生成的 C++ 代码。此全局变量的单个实例在引用其符号的两个共享库之间共享。
当进程关闭并运行静态终止阶段时,我看到此共享实例上的析构函数运行了两次!每次卸载时大概每个库一次。
这个问题与我最近在这里看到的另一个问题密切相关:related question。这听起来像是相同的行为,但没有讨论为什么会发生这种情况。
有人知道这种行为背后的理论解释吗?
【问题讨论】:
-
编译器生成的代码每个变量只能运行一次。尝试在运行析构函数时获取变量的地址,以验证它是否是同一个对象。
-
也许你在某个智能指针类中存储了一个指向对象的指针,它试图破坏它的目标。
-
那么全局只定义在一个库中(一个编译单元)?
-
请准确解释您是如何构建事物的,以便“在引用其符号的两个共享库之间共享此全局变量的单个实例”。
-
地址肯定是一样的。我可以看到构造函数和析构函数针对相同的内存位置运行了两次。我实际上认为全局是在两个库的编译单元中定义的,尽管我不清楚为什么会这样。该变量在静态库 (.a) 中定义,并且两个共享库都与该存档链接。定义在 .cpp 文件中,对应的 .h 文件只包含一个“extern”声明。有没有很好的资源来详细说明链接器如何确定在构建时从 .a 中提取哪些定义?
标签: c++ linux shared-libraries global-variables destructor