Was ist der Unterschied zwischen .a
.o
und .lo
Datei in C?
Antworten:
Die '.lo'-Datei ist ein Bibliotheksobjekt , das in eine gemeinsam genutzte Bibliothek integriert werden kann, und die' .o'-Datei ist eine Standardobjektdatei
Die .lo-Datei ist das libtool-Objekt , mit dem Libtool bestimmt, welche Objektdatei in eine gemeinsam genutzte Bibliothek integriert werden kann
Hinweis:
Die obigen Antworten gefallen mir zwar, sie decken jedoch nicht das Formular .a / archive library ab. Hier werde ich alle drei mit dem Bonus ansprechen, auch in einem .so-Bibliotheksformat hinzuzufügen. Außerdem werde ich im Sinne von Stackexchange mehr Text verwenden, falls Links beschädigt werden (beachten Sie, dass ich für diesen Link keine Referenzlinks benötigte).
Beim Kompilieren einer O- Datei handelt es sich um eine Objektdatei, die den vom Compiler ausgegebenen Objektcode für die Zielplattform enthält. So erstellen Sie eine O- Datei:
gcc -c filename.c <==== creates filename.o
Beachten Sie, dass in diesem Beispiel kein positionsunabhängiger Code (PIC) erstellt wurde. Wir betrachten dies als ein Objekt für die mögliche Aufnahme in eine statische Bibliothek oder ausführbare Datei. Das heißt, wenn wir eine ausführbare Datei mit einer .o- Datei verknüpfen , wird der Code in der .o-Datei in die ausführbare Datei eingefügt - er wird zur Erstellungszeit und nicht zur Laufzeit gebunden. Das heißt, die ausführbare Datei kann ohne Einbeziehung der O-Datei neu verteilt werden. Vorsichtsmaßnahme: Es ist üblich, dass die .o- Datei als Nicht-PIC betrachtet wird. Wir benennen normalerweise PIC-Objektdateien mit der Erweiterung .lo .
Der Dateityp .a ist eine " Archiv " -Bibliothek. Es enthält eine oder mehrere O-Dateien und wird normalerweise zum Erstellen statischer ausführbarer Dateien verwendet.
Wir verwenden den Befehl ar , um Archivbibliotheken zu bearbeiten. Unten in einem Beispiel, das (1) eine Archivbibliothek aus .o- Dateien erstellt, listet (2) den Inhalt einer auf.
Erstellen Sie die Bibliothek
$ ls *.o
a.o b.o c.o <=== the files going in the archive
$ ar q libmyStuff.a *.o <=== put *.o files in an archive (or new one)
ar: creating libmyStuff.a
$ ls *.a <=== just show the library created
libmyStuff.a
Zeigen Sie den Inhalt einer Archivbibliothek an
$ ar t libmyStuff.a
a.o
b.o
c.o
Die Verwendung von .lo ist eine Konvention, die häufig für positionsunabhängige Objektdateien verwendet wird. Im aktuellen Verzeichnis erstellt der Befehl libtool compile sowohl eine .lo- Datei als auch eine .o- Datei, eine mit PIC-Code und eine ohne PIC-Code. Siehe die Ausgabe unten:
$ libtool compile gcc -c a.c
libtool: compile: gcc -c a.c -fPIC -DPIC -o .libs/a.o <== PIC code
libtool: compile: gcc -c a.c -o a.o >/dev/null 2>&1 <== Not-PIC code
$ ls a.lo a.o
a.lo a.o <=== a.lo contains the PIC code.
Beachten Sie auch, dass das Unterverzeichnis .libs mit ao darin erstellt wurde. Diese Datei ist trotz des Namens PIC-Code. Libtool hat diese Datei in das aktuelle Verzeichnis verschoben und die Erweiterung in .lo geändert .
Sie können .lo- Dateien jederzeit manuell erstellen , indem Sie beim Kompilieren die PIC-Option (en) für gcc verwenden. Verschieben Sie die resultierenden .o- Dateien in die Erweiterung .lo .
Konventionell impliziert .so eine Bibliotheksdatei "Shared Object". Wir legen PIC-Objektdateien in gemeinsam genutzten Bibliotheken ab. Im Vertrag mit .o und .a Dateien ist der Code nicht in der resultierenden kompilierten Datei enthalten , wenn wir mit .so Dateien verknüpfen . Das heißt, wir verwenden die Laufzeitbindung (wie im Fall .lo ). Es gibt mehr als eine Form der Laufzeitbindung, aber darauf werden wir hier nicht eingehen.
.libs/a.o
und und Nicht- PIC ist in a.o
. Libtool erstellt also 3 Dateien: 2 Objektdateien ( .o
), eine PIC- und eine Nicht + .lo
-Datei, die beschreibt, wo sich die Dateien befinden.
Die .lo
Datei ist ein Bibliotheksobjekt, das in eine gemeinsam genutzte Bibliothek integriert werden kann, und die .o
Datei ist eine Standardobjektdatei. Weitere Informationen: Wie installiere und verwende ich die gemeinsam genutzte Bibliothek von libtool (.lo-Dateien)?