2017-01-06 1 views
0

Kürzlich habe ich meine eigenen Bibliotheken (für die Verpackung) zu STATIC geändert. Jetzt erhalte ich Fehlermeldungen, dass eine in der Bibliothek definierte Variable mehrfach definiert ist. Es ist in Ordnung, die Bibliotheken benutzen sich gegenseitig. Aber warum wurde das vom Linker nicht bemerkt, bis ich zu STATIC wechselte? In einer meiner Dateien, setze ich die Variable als 'extern' deklariert und der Linker kennzeichnet es auch als 'mehrfach definiert'. Ist es o.k?Wie 'externe' Variablen in dynamisch verknüpften Bibliotheken gehandhabt werden?

Antwort

1

Grundsätzlich ist der Compiler hat 4 Stufen:

Vorbearbeitung: Makro und Symbolausgabe

Compilierung: Code generieren Zusammenbauen von dem

Zusammenbauen Prozessor ausgeführt werden: Erzeugen binären Code, daß die Maschine kann verstehen (0/1 Binärcode)

Verknüpfung: die drei vorherigen Operationen werden separat für jede Datei durchgeführt, aber wir müssen die Adresszuordnung jeder Variablen, Zeiger, Funktion für das Ganze bearbeiten projizieren Sie hier, wenn wir einige Probleme haben werden, wenn wir eine mehrfache Definition der Variablen haben, weil das Verknüpfen alle Dateien überprüft und eine Ausgabe für das gesamte Projekt erzeugt.

Wenn eine Bibliothek als statisch deklariert ist, kann die deklarierte und definierte Funktion innerhalb dieser Bibliothek nicht vor der Laufzeit verwendet werden, aber in der Kompilierzeit ist es nicht erlaubt, diese Bibliothek in anderen Dateien zu verwenden, wenn dies der Fall ist wir werden Fehler während der Verknüpfungsstufe bekommen, weil der Compiler die Verwendung der Funktion innerhalb dieser statischen Bibliothek durch eine andere Datei herausfinden wird, die nicht erlaubt ist.

Wenn Sie möchten, dass es statisch ist, verwenden Sie das Laufzeitkonzept, um diese Bibliothek zu verwenden (z. B. in C können Sie den Zeiger verwenden, um zu funktionieren.

0

Aber warum wurde dies vom Linker nicht bemerkt, bis ich zu STATIC wechselte?

Laufzeit-Linker ermöglicht doppelte Symboldefinitionen (nur eine wird zur Laufzeit verwendet, dies ist symbol interposition).

Verwandte Themen