Подтвердить что ты не робот

Статическая инициализация и уничтожение глобальных статических библиотек, не встречающихся с g++

До недавнего времени я думал, что статическая библиотека .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 и деструктор не вызываются... почему?
  • Как их автоматически вызывать?

Спасибо.

4b9b3361

Ответ 1

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

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

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