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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

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

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

    【讨论】:

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

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

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

    【讨论】:

    • 感谢您的快速回答。这绝对不是订单问题,因为我已经解决了。 init 不方便,因为我想在任意数量的 cpp 文件中声明任意数量的此类变量,并在运行时进程中声明 generated 列表。
    猜你喜欢
    • 1970-01-01
    • 2017-08-16
    • 1970-01-01
    • 2010-11-30
    • 2011-08-22
    • 2010-12-22
    • 2014-04-07
    • 2021-10-28
    • 2015-12-09
    相关资源
    最近更新 更多