Kombinieren Sie zwei GCC-kompilierte .o-Objektdateien in eine dritte .o-Datei

Wie kombiniert man zwei GCC-kompilierte OO-Objektdateien in eine dritte .o-Datei?

$ gcc -c ac -o ao $ gcc -c bc -o bo $ ??? ao bo -o co $ gcc co other.o -o executable 

Wenn Sie Zugriff auf die Quelldateien haben, führt das -combine GCC-Flag die Quelldateien vor der Kompilierung zusammen:

 $ gcc -c -combine ac bc -o co 

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 ordnungsgemäß, da Sie die Ausgabe des Linkers nicht als Eingabe dafür verwenden können. Das Ergebnis ist eine gemeinsam genutzte Bibliothek und ist nicht statisch in die resultierende ausführbare Datei eingebunden.

 $ gcc -shared ao bo -o co $ gcc co other.o -o executable $ ./executable ./executable: error while loading shared libraries: co: cannot open shared object file: No such file or directory $ file co co: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, not stripped $ file ao ao: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped 

Das Übergeben von -r (oder --relocatable ) an ld erzeugt ein Objekt, das als Eingabe von ld geeignet ist.

 $ ld -r ao bo -o co $ gcc co other.o -o executable $ ./executable 

Die generierte Datei hat denselben Typ wie die ursprünglichen .o Dateien.

 $ file ao ao: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped $ file co co: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped 

Wenn Sie ein Archiv aus zwei oder mehr .o-Dateien (dh einer statischen Bibliothek) erstellen möchten, verwenden Sie den Befehl ar :

 ar rvs mylib.a file1.o file2.o