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

时间:2009-12-13 17:56:40

标签: c++ static-variables dead-code

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

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

我肯定错过了一些东西,但我不知道是什么......

3 个答案:

答案 0 :(得分:5)

如果静态库中的对象在应用程序中不是 EXPLICITLY 。然后链接器不会将该对象从lib拉入应用程序。

静态库和动态库之间存在很大差异。

动态图书馆:
在编译时,动态库中没有任何内容。添加额外代码以在运行时显式加载和解析符号。在运行时,加载整个库,从而调用对象初始值设定项(尽管实现细节时)。

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

答案 1 :(得分:1)

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

我解决这些问题的方法是使用某种明确的init函数来完成这些工作,并在main或其他东西开始调用。您可能能够将编译器(或实际上是链接器)提供给目标文件和库参数的顺序摆弄,因为这对我来说也很有用,但是这个解决方案有点脆弱,因为它不仅取决于使用特定链接器,但也可能是特定版本。

答案 2 :(得分:0)

重构执行静态初始化的类,这样它们就不依赖于任何其他类。也就是说,使每个类的初始化独立且自给自足。