gpt4 book ai didi

C++:链接库两次,全局构造函数是否运行两次?

转载 作者:搜寻专家 更新时间:2023-10-31 02:10:25 24 4
gpt4 key购买 nike

如果我有一个库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 声明,情况会有所不同,但显然它不能 - 它使用相同的静态库。

附言。全局对象的析构函数有自己的辅助方法,工作原理大致相同。

关于C++:链接库两次,全局构造函数是否运行两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45335499/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com