webentwicklung-frage-antwort-db.com.de

Kombinieren Sie zwei GCC-kompilierte .o-Objektdateien zu einer dritten .o-Datei

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
8
anon