【发布时间】:2010-12-05 16:39:49
【问题描述】:
我有一个静态库 (lib.a) 和一个链接到它的程序。该库没有任何入口点,在使用它之前总是会被调用,但我需要在程序的早期执行一段代码(最好在 main() 开始之前)。因此我想我会使用我自己的类的静态变量。我添加了包含以下内容的新源文件:
#include <MyClass.h>
static MyClass myVar;
然后 MyClass 的构造函数将执行我的代码。当我链接 lib.a 并尝试对其执行“nm”时,我得到了 myVar 存在的信息。但是,当我链接我的程序并在其上尝试“nm”时,我看不到 myVar。当我将这段代码放入现有文件时,该符号在最终的可执行文件中可见。这是为什么?在这种情况下,链接器可以从 lib.a 库中省略目标文件吗?我知道该变量不是从外部引用的(它不能是静态的),但它应该自己执行代码,因此我不明白为什么要删除它。
如果有什么不同,我会使用一些旧的 SunPro 编译器。
【问题讨论】:
-
编写依赖于全局变量初始化的代码是个坏主意。更好的事情是如何做得更好。
-
@ybungalobil:它可能很有用;例如单元测试。 (这是大多数 C++ 单元测试框架处理自动测试注册的方式)。 @Tomasz:您使用的是什么编译器/平台?
-
@Billy:它可能有用,但前提是最多有一个组件依赖它。否则你会得到非常糟糕的事情(初始化顺序未定义)。他还写道,他使用“旧的 SunPro 编译器”。
-
@ybungalobill:我知道它有问题——但是,我的意思是这并不总是一个坏主意。是的,有一些注意事项需要注意,但这并不意味着没有人应该使用该构造。