gpt4 book ai didi

c++ - 链接器在链接静态库时可以省略目标文件吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:36:00 31 4
gpt4 key购买 nike

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

#include <MyClass.h>
static MyClass myVar;

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

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

最佳答案

从技术上讲,链接器在编译您的程序时应该被强制包含该目标文件。但是,在许多编译器中对此的支持存在错误,例如 MSVC++ .在主程序的某处添加外部引用应该会强制包含该目标文件。

另请注意,在 nm 的情况下,您的静态初始值设定项可能是内联的,因此该符号不需要存在于您的最终二进制文件中。在你的静态中尝试一些有副作用的东西(比如 std::cout 语句),并确保它在责备编译器之前没有运行:)

关于c++ - 链接器在链接静态库时可以省略目标文件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4359859/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com