繁体   English   中英

链接静态库时链接程序可以省略目标文件吗?

[英]can linker omit object file when linking static lib?

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

#include <MyClass.h>
static MyClass myVar;

然后,MyClass的构造函数将执行我的代码。 当我链接lib.a并尝试在其上执行“ nm”时,我会得到有关myVar的信息。 但是,当我链接程序并在其上尝试“ nm”时,看不到myVar。 当我将这段代码放入现有文件中时,该符号在最终的可执行文件中可见。 这是为什么? 在这种情况下,链接器可以省略lib.a库中的目标文件吗? 我知道该变量不是从外部引用的(它不能是静态的),但是它应该自己执行代码,因此我不明白为什么要删除它。

以防万一,我正在使用一些旧的SunPro编译器。

从技术上讲,在编译程序时,应强制链接器包含该目标文件。 但是,在许多编译器(例如MSVC ++)中 ,对此的支持是有问题的。 在您的主程序中的某个地方添加一个外部引用应该强制包含该目标文件。

还要注意,在nm的情况nm ,可能会内联静态初始化程序,因此最终二进制文件中不必存在该符号。 在您的静态环境中尝试一些有副作用的事情(例如std::cout语句),并在责怪编译器之前确保它没有运行:)

事实证明,链接器的工作是相当标准的(我不是说C ++标准,只是一般来说是观察者的行为),您可以解决它。 在GNU ld它是--whole-archive选项,在我使用Sun工具的情况下,它是-z allextract 这实际上并没有达到我的项目预期的效果,因此我使用了一些带有弱符号的魔术,并使用了-z weakextract来实现所需的功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM