c++ - 静态库的全局变量的静态初始化和销毁​​不会在 g++ 中发生

标签 c++ g++ linker global-variables static-libraries

直到前一段时间,我还认为 .a 静态库只是 .o 对象文件的集合,只是将它们归档,而不是让它们以不同的方式处理。但是链接一个.o 对象和链接一个包含这个.o 对象的.a 静态库显然是不一样的。而且我不明白为什么...

让我们考虑以下源代码文件:

// main.cpp
#include <iostream>
int main(int argc, char* argv[]) {
    std::cout << "main" << std::endl;
}

// object.hpp
#include <iostream>
struct Object
{
    Object() { std::cout << "Object constructor called" << std::endl; }
    ~Object() { std::cout << "Object destructor called" << std::endl; }
};

// object.cpp
#include "object.hpp"
static Object gObject;

让我们编译并链接并运行这段代码:

g++ -Wall object.cpp main.cpp -o main1
./main1
> Object constructor called
> main
> Object destructor called

调用全局gObject对象的构造函数和析构函数。

现在让我们从我们的代码创建一个静态库并在另一个程序中使用(链接)它:

g++ -Wall -c object.cpp main.cpp
ar rcs lib.a object.o
g++ -Wall -o main2 main.o lib.a
./main2
> main
  • gObject的构造函数和析构函数没有被调用...为什么?
  • 如何自动调用它们?

谢谢。

最佳答案

.a 静态库包含多个 .o,但除非您从主应用程序中引用它们,否则它们不会被链接。
.o 文件独立链接始终。

所以链接器中的 .o 文件总是进入内部,无论是否引用,但从 .a 文件中只引用 .o 目标文件已链接。

请注意,静态全局对象在您实际引用编译单元中的任何内容之前不需要初始化,大多数编译器会在 main 之前初始化它们,但唯一的要求是它们在任何函数之前初始化编译单元被执行。

关于c++ - 静态库的全局变量的静态初始化和销毁​​不会在 g++ 中发生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1804606/

相关文章:

c++ - 在 Linux 上寻找静态链接排序工具

c++ - Linux C++ 链接器/usr/bin/ld

c++ - 来自不同线程的同一个套接字上发送和接收不起作用

c++ - NS3 添加新模块 - gcc 未找到包含的 header

c++ - 尝试按任何类成员对对象 vector 进行排序

c++ - 如何让 g++ 在终端中显示执行时间?

c++ - 链接目标文件和静态库时出现多重定义错误

gcc - 为什么 gcc 不会编译未初始化的全局常量?

linux - 链接选项不兼容 - 在命令中的任何地方都看不到选项

c++ - C++ 标准中 pair<> 的全局不等式比较