Статическая инициализация и уничтожение глобальных объектов статической библиотеки не происходит с g ++ - PullRequest
22 голосов
/ 26 ноября 2009

До недавнего времени я думал, что статическая библиотека .a - это просто коллекция объектных файлов .o, просто архивирующая их и не обрабатывающая их по-другому. Но связывание с объектом .o и соединение со статической библиотекой .a, содержащей этот объект .o, очевидно, не одно и то же . И я не понимаю, почему ...

Рассмотрим следующие файлы исходного кода:

// 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 не называются ... почему?
  • Как их автоматически вызывать?

Спасибо.

1 Ответ

30 голосов
/ 26 ноября 2009

.a статические библиотеки содержат несколько .o, но они не связаны, если вы не ссылаетесь на них из основного приложения.
.o файлы автономные ссылки всегда.

Так что .o файлы в компоновщике всегда идут внутрь, на которые ссылаются или нет, но из .a файлов только на которые ссылаются .o объектные файлы связаны.

Как примечание, статические глобальные объекты не должны инициализироваться до тех пор, пока вы на самом деле не ссылаетесь на что-либо в модуле компиляции, большинство компиляторов инициализируют их все до main, но единственное требование - они инициализируются перед любой функцией блок компиляции выполняется.

...