C++ 链接静态库时链接器是否可以忽略对象文件?

C++ 链接静态库时链接器是否可以忽略对象文件?,c++,linker,C++,Linker,我有一个静态库(lib.a)和一个链接到它的程序。该库没有任何在使用前总是被调用的入口点,但我需要在程序的早期执行一段代码(最好是在main()启动之前)。所以我想我会使用我自己类的静态变量。我添加了包含以下内容的新源文件: #include <MyClass.h> static MyClass myVar; #包括 静态MyClass-myVar; 然后MyClass的构造函数将执行我的代码。当我链接lib.a并尝试在其上执行“nm”时,我得到了myVar存在的信息。然而,当我

我有一个静态库(lib.a)和一个链接到它的程序。该库没有任何在使用前总是被调用的入口点,但我需要在程序的早期执行一段代码(最好是在main()启动之前)。所以我想我会使用我自己类的静态变量。我添加了包含以下内容的新源文件:

#include <MyClass.h>
static MyClass myVar;
#包括
静态MyClass-myVar;
然后MyClass的构造函数将执行我的代码。当我链接lib.a并尝试在其上执行“nm”时,我得到了myVar存在的信息。然而,当我链接我的程序并在上面尝试“nm”时,我没有看到myVar。当我将这段代码放入一个现有文件中时,符号在最终的可执行文件中可见。为什么呢?在这种情况下,链接器能否从lib.a库中省略对象文件?我知道变量不是从外部引用的(它不能是静态的),但它应该自己执行代码,因此我不明白为什么要删除它


如果它起作用的话,我正在使用一些旧的SunPro编译器。

从技术上讲,链接器在编译程序时应该强制包含该对象文件。然而,在许多编译器中,对它的支持是有缺陷的,例如。在主程序的某个地方添加外部引用将强制包含该对象文件


还请注意,在
nm
的情况下,静态初始值设定项可能是内联的,因此符号不必存在于最终二进制文件中。在静态中尝试副作用(如<代码> STD::CUT语句),并确保在编译编译器之前不运行:(

< P>),链接器所做的是相当标准的(我不指C++标准,只是一般观察者行为),并且可以围绕它工作。在GNU
ld
中,它是
--whole archive
选项,在我的Sun tools中,它是
-z allextract
。这实际上并没有像我的项目预期的那样起作用,所以我使用了一些弱符号的魔法来实现我想要的。

编写依赖于全局变量初始化的代码是个坏主意。更好的事情是如何做得更好。@ybungalobil:它可能有用;例如单元测试。(这就是大多数C++单元测试框架如何处理自动测试注册)。Tomasz:您使用的是什么编译器/平台?@Billy:它可能有用,但前提是最多有一个组件依赖它。否则,您可能会得到非常糟糕的结果(初始化顺序未定义)。他还写道,他使用的是“旧的SunPro编译器”。@ybungalobill:我知道它有问题——然而,我的观点是,这并不总是一个坏主意。是的,有一些警告需要注意,但这并不意味着任何人都不应该使用该构造。我知道它不起作用,这就是我开始研究nm的原因。谢谢它应该正常工作的信息,但是知道它是由C++ +其他标准定义还是它在其他编译器中工作会很好?@ ToMasz:C++标准没有说明最终的二进制是如何被组装的。(即,标准不知道静态或动态库的存在)这是因为标准是编写为机器无关的,并且在许多体系结构(特别是分离代码和数据的体系结构)上不可能使用此类库