2016-07-20 5 views
4

Ich habe etwa 10 Quelldateien (. C) mit Kopfzeilen (. H). Nur zwei Quelldateien (.c) sind in ausführbare Dateien (ELF) verknüpft und enthalten die Hauptfunktion. Die meisten Dateien werden in Objekte (.o) kompiliert und (neu) (statisch verknüpft) mit den ausführbaren Dateien verwendet.GNU make und Liste der Objekte

Ich habe versucht, eine allgemeine Regel zu definieren alle Objekte zu bauen:

%.o : %.c 
    $(CC) $(CCFLAGS) -c -o [email protected] $< 

Dies funktioniert gut für die in Objekte zusammengestellt Quellen. Ich muss mich nicht jedes Mal darum sorgen, die Datei make zu aktualisieren, wenn ich eine neue Quelldatei hinzufüge.

Aber ich weiß nicht, was wäre der beste Weg, um Regeln zum Erstellen ausführbarer Dateien zu erstellen?

exec1 : object1.o object2.o object3.o 
    call the linker 
exec2 : object1.o object2.o object4.o object5.o 
    call the linker 

Dies wird funktionieren; aber wenn ich eine neue Kopfzeile (foo.h) hinzufügen werde, muss ich auch daran denken, die Liste der Objekte für diese Regel zu aktualisieren (foo.o hinzufügen).

Gibt es irgendeine Möglichkeit, die erforderlichen Objekte für ein bestimmtes Ziel (möglicherweise basierend auf den enthaltenen Header-Dateien) automatisch auflösen könnte?

Gibt es eine bessere Möglichkeit, das Ziel für eine ausführbare Datei zu definieren?

Hinweis: Ich kann keine Platzhalter verwenden, da nicht alle ausführbaren Dateien alle Objekte benötigen. Oder könnte Linker überflüssige Objekte entfernen?

Danke!

+0

Die Art, wie Sie für die ausführbare Datei angegeben haben, ist in Ordnung, normalerweise würde ein neues Header-Objekt die C-Quelle ändern, die sie enthält. – dvhh

+0

Durch die explizite Regel zum Generieren der Code-Objektdatei, ist auch eine Standard-GNU-Make-Regel und andere Make-Variante – dvhh

+1

Die kurze Antwort auf Ihre spezifische Frage ist nein, es gibt keine Möglichkeit für make, automatisch zu erraten, die Objekte in einem sein sollten ausführbar basierend auf den Header-Dateien in der Quelle. – MadScientist

Antwort

0

können Sie wildcard Funktion verwenden, um Dateiliste Wartung wie

sources := $(patsubst %.c,%.o,$(wildcard *.c)) 

Sie auch eine Liste von Header-Dateien wie

headers := $(wildcard *.h) 

machen sollte zu automatisieren und sie in der Regel, wie Kompilation hinzufügen

%.o : %.c $(headers) 

GNU Make manual (https://www.gnu.org/software/make/manual/make.html) hat weitere Informationen auf, einschließlich möglicher Fallstricke.

+2

Das OP kann keine Platzhalter verwenden, da nicht alle ausführbaren Dateien alle Objekte benötigen. Und es ist keine gute Idee, eine Abhängigkeit für alle Header für jede Objektdatei hinzuzufügen. Verwenden Sie stattdessen die cpp-Option '-MD'. – blatinox

+0

@blatinox Sie sind nicht völlig richtig. Obwohl nicht alle Objekte von allen Headern abhängen, müssen alle Objekte neu erstellt werden, wenn sich die relevanten Headern ändern. Und dann wird nur die relevante ausführbare Datei neu verknüpft. '-MD' ist eine Option, aber es wird Build viel komplexer machen. Meine Methode ist sehr einfach und funktioniert gut für kleine Projekte. Zumindest arbeite ich immer auf diese Weise – GMichael

+1

Nein, wenn Sie eine Kopfzeile ändern, müssen nur Objekte, die diese Kopfzeile enthalten, neu erstellt werden. Mit Ihrer Lösung bauen Sie alle Objekte neu auf! Es ist nutzlos, auch wenn es für kleine Projekte funktioniert. '-MD' und andere (' -MMD', '-MP', ...) ist nicht komplex: Sie müssen nur 3 Zeilen in Ihrem Makefile hinzufügen und' make' und 'cpp' erledigen die Aufgabe für Sie. – blatinox