静态变量初始化代码永远不会被调用

Posted

技术标签:

【中文标题】静态变量初始化代码永远不会被调用【英文标题】:static variable initialisation code never gets called 【发布时间】:2010-12-26 05:07:26 【问题描述】:

我有一个使用我制作的静态库的应用程序。库中的一个 .cpp 文件有一个静态变量声明,它的 ctor 在一个单例上调用一个函数来做某事——例如添加一个字符串。

现在,当我从应用程序中使用该库时,我的单例似乎不包含任何应该添加的字符串的痕迹。

我肯定错过了什么,但我不知道是什么..

【问题讨论】:

【参考方案1】:

如果您在应用程序中没有明确使用的静态库中的对象。然后链接器不会将该对象从库中拉到应用程序中。

静态库和动态库有很大区别。

动态库: 在编译时,不会从动态库中提取任何内容。添加了额外的代码以在运行时显式加载和解析符号。在运行时加载整个库并因此调用对象初始化程序(尽管何时是实现细节)。

静态库的处理方式非常不同: 当您链接到静态库时,它会将库中定义的应用程序中未定义的所有项目拉到应用程序中。重复此过程,直到没有库可以解决的更多依赖项为止。这样做的副作用是没有显式使用的对象/函数不会从库中拉出(因此不会直接访问的全局变量不会被拉出)。

【讨论】:

你成功了,谢谢。实际上它没有被明确使用,但我认为它将保持代码处于调试模式。【参考方案2】:

重构进行静态初始化的类,使它们不依赖于任何其他此类。即让每个类的初始化独立且自给自足。

【讨论】:

重点是,静态变量的存在只是为了注册(在它们的 ctor 中)一个静态函数 - 在 cpp 文件中定义 - 到一个列表中,这样我可以稍后在运行时选择其中一个.所以在这种情况下没有独立的概念 - 我认为。【参考方案3】:

我对此的记忆有点模糊,但您可能会遇到初始化顺序问题。无法保证调用不同文件中的静态变量初始化程序的顺序,因此,如果在初始化库中的静态变量时尚未初始化单例,则可能会产生您所看到的效果。

我解决这些问题的方法是使用某种显式的init 函数来执行此操作,并且我会在main 的开头调用它。您可能可以调整将目标文件和库参数提供给编译器(或实际上是链接器)的顺序,因为这也适用于我,但该解决方案有点脆弱,因为它不仅取决于使用特定的链接器,但也可能是特定的版本。

【讨论】:

感谢您的快速回答。这绝对不是订单问题,因为我已经解决了。 init 不方便,因为我想在任意数量的 cpp 文件中声明任意数量的此类变量,并在运行时进程中声明 generated 列表。

以上是关于静态变量初始化代码永远不会被调用的主要内容,如果未能解决你的问题,请参考以下文章

静态局部变量

静态变量

final,static静态和非静态,初始化和代码块的区别父类和子类中都有static变量时的初始化顺序重写equals() instanceof强制转换

何时选择变量来声明为最终静态

php自定义函数之静态变量

在C ++类中初始化静态变量?