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