C++:链接库两次,全局构造函数运行两次吗?
C++: link library twice, are global constructors run twice?
如果我有一个库foo,里面有一些静态初始化代码,并且链接情况如下:
executable -> libShared.so (dynamic linking)
executable -> libFoo.a (static linking)
libShared.so -> libFoo.a (static linking)
这是否会导致静态初始化代码运行两次 - 如果它有副作用,可能会做两个不同的可见事情?
libShared.so 只导出自己的符号,而不导出任何libFoo.a,这是正确的。但是在这个过程中有两个libFoo.a的副本,有效地彼此分开命名空间。我的理解是否正确 - 会有一个重复的初始化步骤?
(当然,正确的方法是让libFoo.a不做任何事情,例如在其静态初始值设定项中创建可见的副作用,但让我们假设船已经航行了......
是的,构造函数将运行两次。生成可执行文件或共享库时,将创建一个帮助程序方法,该方法枚举要构造的所有全局变量并调用其初始值设定项(ISO C++允许其他方法,但不用于具有共享库的系统(。加载可执行文件和共享库时,将调用这些帮助程序。
现在你碰巧有两个这样的方法来初始化内存的两个不同部分。这将创建两个对象,它们的地址会有所不同。
如果可执行文件只有全局的extern
声明,这将有所不同,但显然它不能 - 它使用相同的静态库。
全局对象的析构函数有自己的辅助方法,工作原理大致相同。
静态库只是对象文件的串联 - 其中没有代码来运行静态对象的构造函数,除非您显式提供此类代码。因此,静态库中的静态对象不会让构造函数运行两次,甚至可能运行一次。此外,由于大多数链接器搜索静态库的方式,多次链接到它们是一种非常常见的做法。
相关文章:
- 用相同的参数声明两个构造函数的最偶像化的方法是什么?
- pair的两个构造函数几乎相同,为什么不生成构建错误?
- 为什么<T> LLVM 中的预期为 Expect&&... 实现两个构造函数<T>?
- 为什么我的类只适用于两个构造函数 C++
- 两个构造函数(带和不带参数),没有输入 -> 没有参数运行。跳过上述类中的构造函数
- 类介绍 (c++) 项目希望我们创建两个构造函数,但它们都不需要任何参数 - 我应该在这里做什么?
- 除了两个构造函数外,C++库导入也可以工作
- 两次构造对象
- 在两个构造函数之前将我的静态数据成员在 CPP 文件中初始化为 0
- 如何有条件地在具有相同签名的两个构造函数之间切换
- RAII 在两个构造函数之间进行选择的方式
- 调用对数组引用两次的函数
- std::make_shared在VS2012中进行了两次构造函数调用
- 具有两个构造函数的抽象类
- 如何在c++中实现二次构造函数
- 这两个构造函数调用之间的区别
- 为什么在我的程序中调用两个构造函数
- 组合复制和移动的两个构造函数
- 为什么这两个构造函数一起不会产生歧义错误?
- C++两次传递函数指针导致问题