linux obj stellt „.o“ in Linux dar, die Zieldatei, die der „.obj“-Datei in Windows entspricht; obj speichert kompilierten Code und Daten und hat einen Namen, sodass beim Herstellen einer Verbindung manchmal Probleme auftreten Es entstehen äußere Symbole.
Die Betriebsumgebung dieses Tutorials: Linux5.9.8-System, Dell G3-Computer.
Wofür steht Linux obj?
Eine kurze Analyse von .a-, .so- und .o-Dateien in Linux
Vorwort
Wenn wir Quellcode auf der Linux-Plattform installieren, stoßen wir häufig auf .so- und .o-Dateien Informationen ausgeben. Im Allgemeinen müssen wir nur einen Blick auf die Ausgabeinformationen dieser Dateien werfen und müssen sie nicht eingehend untersuchen. Wenn wir den Quellcode jedoch selbst schreiben und manuell kompilieren müssen, müssen wir diese Informationen genau verstehen.
Dateierklärung
Unter Linux entsprechen diese .so-, .o- und .a-Dateien tatsächlich obj, lib, dll, exe und anderen Dateien in Windows. Bevor wir diese Dateien unter Linux erklären, sprechen wir zunächst über die Rolle dieser Dateien unter Windows.
Die Beziehung zwischen obj, lib, dll und exe unter Windows
exe ist das Suffix des ausführbaren Programms, das wir normalerweise kennen, während obj, lib und dll die Schlüsseldateien sind, aus denen das laufende Programm besteht. lib entspricht dll. lib ist die Bibliotheksdatei der statischen Linkbibliothek und dll ist die Bibliotheksdatei der dynamischen Linkbibliothek.
Die sogenannte Statik bedeutet, dass Sie beim Verknüpfen die erforderlichen Dinge extrahieren und in Ihrer Exe-Datei anordnen. Wenn Sie Ihre Exe in Zukunft ausführen, benötigen Sie keine Lib mehr. Die sogenannte Dynamik bedeutet, dass die Ausführung der Exe von den in der DLL bereitgestellten Funktionen abhängt. Ohne diese DLL kann Ihre Exe nicht ausgeführt werden.
lib, dll und exe gelten alle als endgültige Zieldateien und Endprodukte. Und c/c++ gehört zum Quellcode. Der Übergang zwischen dem Quellcode und der endgültigen Zieldatei ist das Zwischencodeobjekt. Der Grund, warum der Zwischencode benötigt wird, besteht darin, dass Sie die Zieldatei nicht sofort abrufen können.
Zum Beispiel erfordert eine Exe die Generierung vieler CPP-Dateien. Der Compiler kann jeweils nur eine CPP-Datei kompilieren. Auf diese Weise wird ein CPP nach dem Kompilieren in Obj kompiliert. Wenn alle erforderlichen CPPs in Obj kompiliert sind, werden sie vereinheitlicht und in die erforderliche Exe-Datei verknüpft Der Exe-Link schlägt fehl.
obj speichert kompilierten Code und Daten mit Namen, sodass während der Verbindung manchmal ungelöste Probleme mit externen Symbolen auftreten können. Wenn es mit einer Exe verbunden ist, gibt es kein Namenskonzept, sondern nur die Adresse. lib ist eine Kombination aus einer Reihe von obj.
Theoretisch können Sie OBJ-Dateien verbinden, um auf andere Projekte zu verweisen (Sie können sich eine OBJ-Datei als Äquivalent zur CPP-Datei vorstellen, die sie kompiliert und generiert. Sie können auf OBJ verweisen, um CPP zu ersetzen, oder CPP hinzufügen, um OBJ zu ersetzen). In der Praxis wird jedoch normalerweise lib verwendet, um gegenseitige Referenzen zwischen Projekten zu erreichen.
Der Compiler verknüpft standardmäßig einige häufig verwendete Bibliotheken, andere müssen Sie selbst angeben.
Der Unterschied zwischen lib und dll
lib wird beim Kompilieren und DLL beim Ausführen benötigt. Wenn Sie die Kompilierung des Quellcodes abschließen möchten, reicht lib aus. Wenn Sie dynamisch verknüpfte Programme zum Laufen bringen möchten, reicht eine DLL aus. Während der Entwicklungs- und Debugging-Phase ist es natürlich am besten, beides zu haben.
Allgemeine dynamische Bibliotheksprogramme umfassen lib-Dateien und dll-Dateien. Die lib-Datei muss während der Kompilierung mit der Anwendung verbunden sein, während die dll-Datei nur zur Laufzeit aufgerufen wird. Wenn eine DLL-Datei vorhanden ist, enthält die entsprechende LIB-Datei im Allgemeinen einige Indexinformationen, und die spezifische Implementierung befindet sich in der DLL-Datei. Wenn nur eine lib-Datei vorhanden ist, wird diese lib-Datei statisch kompiliert und der Index und die Implementierung befinden sich darin.
Statisch kompilierte lib-Dateien haben Vorteile: Bei der Installation für Benutzer müssen keine dynamischen Bibliotheken installiert werden. Es gibt jedoch auch Nachteile: Die Anwendung ist relativ groß und die Flexibilität der dynamischen Bibliothek geht verloren. Wenn die Version aktualisiert wird, muss gleichzeitig eine neue Anwendung veröffentlicht werden.
Im Fall einer dynamischen Bibliothek gibt es zwei Dateien. Eine davon ist die Importbibliotheksdatei (.LIB) (eigentlich handelt es sich auch um eine statische Bibliothek, aber beim Verknüpfen können Sie nur den Eintrag der Funktion in der DLL verknüpfen zur Exe, und im Gegensatz zu einer echten statischen Linkbibliothek, die den Funktionskörper tatsächlich mit der Exe verknüpft, wird die dynamische Verknüpfung über lib tatsächlich mithilfe einer statischen Verknüpfung implementiert. Die importierte Bibliotheksdatei enthält den Namen und die Funktion der Von der DLL exportierte Funktion. Die Anwendung verwendet die LIB-Datei, um eine Verknüpfung zu der DLL-Datei herzustellen, die sie verwenden muss. Die Funktionen und Daten in der Bibliothek werden nicht in die ausführbare Datei kopiert
In der ausführbaren Datei der Anwendung wird also nicht der Code der aufgerufenen Funktion gespeichert, sondern die Speicheradresse der aufzurufenden Funktion in der DLL. Auf diese Weise wird das Programm ausgeführt, wenn eine oder mehrere Anwendungen ausgeführt werden Code und aufgerufene Funktion werden verkettet gespeichert, wodurch Speicherressourcen gespart werden. Wie aus der obigen Beschreibung hervorgeht, müssen DLL- und .LIB-Dateien mit der Anwendung verteilt werden, da die Anwendung sonst Fehler generiert.
Funktionen in DLL sind in zwei Typen unterteilt:
dll-exportierte Funktionen, die von Anwendungen aufgerufen werden können;
dll-interne Funktionen, die nur in DLL-Programmen verwendet werden können und von Anwendungen nicht aufgerufen werden können
.o, . a unter Linux Der Unterschied zwischen .so-Dateien und .o ist die Zieldatei, die der .obj-Datei in Windows entspricht.
.so ist eine gemeinsam genutzte Bibliothek, ein gemeinsam genutztes Objekt, das für dynamische Verbindungen verwendet wird und einer DLL unter Windows und einer ausführbaren Datei unter Linux entspricht.
.a ist eine statische Bibliothek, um es ganz klar auszudrücken: Es handelt sich um eine Reihe von .o, die für eine statische Verbindung zusammengestellt wurden.
Statische Funktionsbibliothek
Eigenschaften: Es handelt sich eigentlich um eine Sammlung einfacher gewöhnlicher Zieldateien, die dem Zielprogramm hinzugefügt werden, bevor das Programm ausgeführt wird.
Vorteile: Kompatibel mit einigen früheren Programmen; einfache Beschreibung ermöglicht es Programmierern, Programme zu verknüpfen, ohne den Code neu zu kompilieren, was bedeutet, dass keine Unterstützung für externe Funktionen erforderlich ist, wodurch die Zeit für die Neukompilierung des Codes gespart wird (dieser Vorteil ist derzeit nicht offensichtlich); Entwickler können den Quellcode auch geheim halten.
Der Name dieser Art von Bibliothek lautet normalerweise libxxx.a. Die mit einer statischen Funktionsbibliothek kompilierten Dateien sind relativ groß, da alle Daten der gesamten Funktionsbibliothek in den Zielcode integriert werden.
Nachteile: Wenn sich die statische Funktionsbibliothek ändert, muss Ihr Programm neu kompiliert werden.
Freigegebene Funktionsbibliothek
Die gemeinsam genutzte Funktionsbibliothek wird geladen, wenn das ausführbare Programm gestartet wird, und die Funktionen in der gemeinsam genutzten Funktionsbibliothek können automatisch geladen werden, wenn alle Programme erneut ausgeführt werden. Im Vergleich zu statischen Funktionsbibliotheken werden gemeinsam genutzte Funktionsbibliotheken beim Kompilieren nicht in den Zielcode kompiliert.
Die entsprechende Funktion in der gemeinsam genutzten Funktionsbibliothek wird nur aufgerufen, wenn das Programm die entsprechende Funktion ausführt. Daher ist die von der gemeinsam genutzten Funktionsbibliothek generierte ausführbare Datei relativ klein. Da die gemeinsam genutzte Funktionsbibliothek nicht in Ihr Programm integriert ist, wird sie verwendet Wenn das Programm ausgeführt wird, muss die entsprechende Bibliothek in der laufenden Umgebung des Programms bereitgestellt werden.
Änderungen in der gemeinsam genutzten Funktionsbibliothek wirken sich nicht auf Ihr Programm aus, daher ist es bequemer, die gemeinsam genutzte Funktion zu aktualisieren Bibliothek.
Verwandte Empfehlungen: „
Linux-Video-TutorialDas obige ist der detaillierte Inhalt vonWofür steht Linux obj?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!