Frage

Bis vor einiger Zeit, dachte ich eine .a statische Bibliothek war nur eine Sammlung von .o Objektdateien, nur um sie zu archivieren und nicht so dass sie anders gehandhabt. Aber Verknüpfung mit einem .o Objekt und die Verknüpfung mit einer .a statischen Bibliothek mit diesem .o Objekt ist offenbar nicht das gleiche . Und ich verstehe nicht, warum ...

Lassen Sie uns die folgenden Quellcode-Dateien betrachten:

// 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;

Lassen Sie uns zusammenzustellen und und diesen Code ausführen:

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

Der Konstruktor eine der Destruktor des globalen gobject Objekt aufgerufen wird.

Lassen Sie sich jetzt erstellen statische Bibliothek aus unserem Code und verwendet (Link) in einem anderen Programm:

g++ -Wall -c object.cpp main.cpp
ar rcs lib.a object.o
g++ -Wall -o main2 main.o lib.a
./main2
> main
  • gobject Konstruktor und Destruktor nicht aufgerufen ... warum?
  • Wie haben diese automatisch mit?

Danke.

War es hilfreich?

Lösung

.a statische Bibliotheken enthalten mehrere .o aber sie sind nicht verbunden in, wenn man sich von dem Haupt-App verweisen.
.o Dateien Standalone-Link immer.

So .o Dateien im Linker immer innen gehen, referenziert oder nicht, aber aus .a Dateien nur referenziert .o Objektdateien verknüpft sind.

Als Hinweis, statische globale Objekte werden nicht initialisiert werden benötigt, bis Sie tatsächlich etwas in der Übersetzungseinheit verweisen, die meisten Compiler werden alle von ihnen vor dem Haupt initialisieren, aber die einzige Voraussetzung ist, dass sie vor jeder Funktion des initialisiert, Übersetzungseinheit wird ausgeführt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top