Wie kombiniert man zwei GCC-kompilierte .o-Objektdateien zu einer dritten .o-Datei?
$ gcc -c a.c -o a.o
$ gcc -c b.c -o b.o
$ ??? a.o b.o -o c.o
$ gcc c.o other.o -o executable
Wenn Sie Zugriff auf die Quelldateien haben, werden die Quelldateien vor dem Kompilieren mit dem GCC-Flag -combine
Zusammengeführt:
$ gcc -c -combine a.c b.c -o c.o
Dies funktioniert jedoch nur für Quelldateien, und GCC akzeptiert keine .o
- Dateien als Eingabe für diesen Befehl.
Normalerweise funktioniert das Verknüpfen von .o
- Dateien nicht richtig, da Sie die Ausgabe des Linkers nicht als Eingabe dafür verwenden können. Das Ergebnis ist eine gemeinsam genutzte Bibliothek und nicht statisch mit der resultierenden ausführbaren Datei verknüpft.
$ gcc -shared a.o b.o -o c.o
$ gcc c.o other.o -o executable
$ ./executable
./executable: error while loading shared libraries: c.o: cannot open shared object file: No such file or directory
$ file c.o
c.o: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, not stripped
$ file a.o
a.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
Vorbeigehen -relocatable
oder -r
bis ld
erstellt ein Objekt, das als Eingabe von ld
geeignet ist.
$ ld -relocatable a.o b.o -o c.o
$ gcc c.o other.o -o executable
$ ./executable
Die generierte Datei ist vom selben Typ wie das ursprüngliche .o
Dateien.
$ file a.o
a.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
$ file c.o
c.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
Wenn Sie ein Archiv aus zwei oder mehr .o-Dateien (d. H. Einer statischen Bibliothek) erstellen möchten, verwenden Sie den Befehl ar
:
ar rvs mylib.a file1.o file2.o