2009-08-28 16 views
12

wir haben einige C++ - Code, den wir benötigen, um eine make-Datei zu erstellen. Jedes .h und .c Paar erstellen ein Objekt und dann einige Objekte miteinander zu einer ausführbaren Datei verbunden sind. Ziemlich normales Zeug.gmake kompilieren alle Dateien in einem Verzeichnis

Dieser Nicht-Gnu make-Befehl baut nur alle Dateien in Objekt in einem Verzeichnis

%.o:%.C 
    $(CC) $(CPFLAGS) -c $< 

Was das bedeutet ist für jedes% .C-Datei (dh jede .C-Datei) baut eine .o-Datei entspricht, .

Weiß jemand, wie man das mit gmake macht?

Prost

Mark

Antwort

19

Die Syntax, die Sie gezeigt haben, wird in GNU make-Sprache als Musterregel bezeichnet und bildet den Grundstein Ihrer Lösung. Sie müssen lediglich einen Weg hinzufügen, um die Liste der .C-Dateien dynamisch zu erhalten. Andere haben Lösungen gezeigt, die $(shell) dazu verwenden, aber das ist unnötig ineffizient. Ich schlage vor, Sie stattdessen $ verwenden (Wildcard), die eine GNU integrierte Funktion nur für diesen Zweck ausgelegt ist insbesondere:

SRCS = $(wildcard *.C) 
OBJS = $(patsubst %.C,%.o,$(SRCS)) 
foo: $(OBJS) 
     $(CC) -o [email protected] $^ 

%.o: %.C 
     $(CC) $(CPFLAGS) -c $< 

Wenn Sie etwas prägnanter suchen, werden die folgenden Arbeiten zu:

Dies beseitigt nur die Variablen und nutzt die Tatsache, dass GNU make eine Standardmusterregel sowie eine Standardregel für die Verknüpfung einer ausführbaren Datei aus einer Gruppe von Objekten bereitstellt. Persönlich würde ich die ausführlichere Version verwenden, da ich es einfacher finde, sie zu lesen und zu pflegen, aber für jede ihre eigene.

Hoffnung, die hilft,

Eric Melski

1

Dies ist ein Beispiel eines pattern rule ist, sollte es in gmake gut funktionieren. Für sehr einfache Builds wie diese können Sie sich meistens auf die implicit rules verlassen. Die Hauptsache Sie im Ziel angeben müssen Sie wollen bauen und ihre Abhängigkeiten:

CXXFLAGS:=-g -O -Iincludes 
LDFLAGS:=-lm 

SRCS:=$(shell ls *.C)   # select all .C files as source 
OBJS:=$(substr .C,.o,$(SRCS) # list the corresponding object files 

foo : $(OBJS) 

Beachten Sie die Verwendung von simply expanded variable Zuweisungsoperator (:=) anstelle der rekursiven Zuweisungsoperator (=), die die Menge an reduzieren Wiederaufbereitung machen macht in komplizierteren Builds.

+0

Sie irren; Das OP zeigt eine Standardmusterregel, keine statische Musterregel, und es gibt keinen guten Grund, $ (Shell) hier zu verwenden, wo $ (Wildcard) ohne den zusätzlichen Overhead funktioniert. –

+0

@Eric: Korrigiere natürlich die statische Musterregel. Fest. Ich benutze $ (shell) viel trotz der zusätzlichen Gabel, weil ich den Befehl oft verallgemeinere. Durch die Verwendung von: = Zuordnung erleide ich extra nur einmal. – dmckee

+0

können Sie genauso einfach verwenden: = mit $ (Wildcard) wenn Sie möchten. –

Verwandte Themen