2009-06-14 2 views
3

Ich habe versucht, so etwas wie dies in einer Make-Datei zu tun:ist es möglich, eine Objektdatei aus anderen Objektdateien in gcc zu erstellen?

program.exe: ui.o main.o 
    gcc ......etc 
ui.o: window1.o window2.o 
    gcc -c window1.o window2.o -o ui.o #this doesn't want to work 
window1.o: window1.c window1.h window1_events.c window1_controls.c ... 
    gcc -c window1.c window1_events.c window1_controls.c... -o window1.o 
window2.o: ... 
    gcc ... 
main.o: ... 
    gcc ... 

aber wenn ich so zusammenstellen, gibt es die Fehlermeldung „Eingabedatei ungenutzt, da keine Bindung getan“, und dann bekomme ich eine Reihe von ungelösten Externe, etc. - durch Änderung

program.exe: ui.o main.o 
    gcc ... 

zu

program.exe: window1.o window2.o main.o 
    gcc ... 

Probleme, die so gelöst werden, ist es möglich, zu verknüpfen nur Objektdateien toge Oder, um zu vermeiden, kilometerlange Zeilen in einem Makefile zu haben und den Build-Prozess etwas mehr zu unterbrechen?

+0

Mögliches Duplikat von [zwei GCC-kompilierte .o-Objektdateien in eine dritte .o-Datei kombinieren] (http://stackoverflow.com/questions/2980102/combine-two-gcc-compiled-o-object-files-into -a-third-o-file) –

+0

Konsens ist, dass upvotes wichtiger als das Alter sind. Fragen sind für immer nützlich, so alt zu sein bedeutet nicht, dass es nicht geschlossen werden sollte. Peace s2 –

Antwort

8

Ich Haufen von Objektdateien ist eine Bibliothek. Sie können eine Bibliothek mit dem Dienstprogramm ar erstellen. Im folgenden Beispiel wird eine Bibliothek namens mylib.a enthält die Dateien foo.o und bar.o

ar rvs mylib.a foo.o bar.o 

Sie können dann mit ihm verknüpfen, indem es auf der Compiler-Befehlszeile:

gcc -o myexe main.c mylib.a 
+0

klare und kurze Antwort! – Atmocreations

3

zu erstellen sie eine Bibliothek:

ar rvs somelib.a file1.o file2.o file3.o 

es um eine Verknüpfung:

gcc -o program.exe file4.o somelib.a 
15

Ja: auf mehrere Objektdateien zu einer Einheit verschmelzen, verwenden ld -r oder ld -Ur:

Von "Mann ld" auf Linux:

-r 
    --relocatable 
     Generate relocatable output---i.e., generate an output file that can 
     in turn serve as input to ld. This is often called partial linking. 
     As a side effect, in environments that support standard Unix magic 
     numbers, this option also sets the output file’s magic number to 
     "OMAGIC". 
     If this option is not specified, an absolute file is produced. 
     When linking C++ programs, this option will not resolve references to 
     constructors; to do that, use -Ur. 

Sie können tun dies auch mit gcc:

gcc -Wl,-r foo.o bar.o -o foobar.o -nostdlib 

Das Zusammenführen von Objektdateien hat einige Vorteile gegenüber der Verwendung einer Archivbibliothek: Wenn sich zusammengeführte Dateien sehr selten ändern (im Vergleich zu main.c), werden Ihre endgültigen ausführbaren Verknüpfungen schneller.

OTOH, mit der archivierten Bibliothek wird der Linker nur das verwenden, was er benötigt, so dass Ihre ausführbare Datei möglicherweise kleiner wird, wenn z. window2.c wird nicht benötigt.