24

直到前一段时间,我还认为 .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的构造函数和析构函数没有被调用...为什么?
  • 如何让它们自动调用?

谢谢。

4

1 回答 1

33

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

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

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

于 2009-11-26T16:25:15.827 回答