2016-11-09 2 views
0

Ich entschuldige mich, wenn diese Frage schon einmal gestellt wurde, ich recherchierte und konnte keine passende Antwort finden.Erzeuge mehr als eine Datei mit einer Regel - Makefile

Ich habe ein C++ Projekt, das ich mit make kompilieren muss.

Die Ausgabe, die ich möchte, ist drei verschiedene ausführbare Dateien mit einer make-Datei, aber ich muss es mit einer Musterregel zu kompilieren.

Das Projekt besteht aus drei Quelldateien für jede ausführbare Datei, alle verwenden eine Funktion aus einer Headerdatei, die ich in eine Objektdatei kompiliere.

Ich habe es geschafft, sie alle, aber unter Verwendung einer separaten Regel für jede Datei

Ein Beispiel für eine Regel zu kompilieren:

file1: file1.cpp header.o header.h 
     g++ $(FLAGS) file1.cpp header.o -o file1 

Dank.

Edit:

file1: file1.cpp header.o header.h 
    g++ $(FLAGS) file1.cpp header.o -o file1 

file2: file2.cpp header.o header.h 
    g++ $(FLAGS) file2.cpp header.o -o file2 

file3: file3.cpp header.o header.h 
    g++ $(FLAGS) file3.cpp header.o -o file3 

Dies sind die ausführbaren Dateien

header.o: header.cpp header.h 
     g++ $(FLAGS) -c header.cpp -o header.o 

Und das ist die Objektdatei mit der Funktion

FLAGS Variable das Verzeichnis enthält, in dem die Header-Dateien gespeichert sind.

+0

Warum 'file1' hängen von den beiden' header.o 'und' header.h'? Warum kompilieren Sie Kopfzeilen an erster Stelle? In jedem Fall, wenn das Muster 'file1: file1.cpp' für jede ausführbare Datei gilt, brauchen Sie nicht einmal ein einziges Rezept, schreiben Sie ein [mcve]. – user657267

+0

Hallo, ich habe den Hauptpost bearbeitet und den gesamten Code, den ich habe, hinzugefügt. Ich kompiliere die Header-Dateien zum Objektcode, um sie dann mit jeder ausführbaren Datei zu verknüpfen. – Joe

+0

Das ist immer noch kein MCVE, was ist 'FLAGS' eingestellt? Der Grund, warum ich "header.o" erwähnte, ist, dass Sie ** Header niemals separat kompilieren (außer wenn Dinge wie vorkompilierte Header verwendet werden, die Sie nicht hier sind), sie sind in anderen Übersetzungseinheiten enthalten. – user657267

Antwort

1

Fabrikat hat built-in rules zum Kompilieren und Binden, alles, was Sie tun müssen, ist das richtige Format für Ihre Variablen und Regeln zu verwenden, sollte die folgende Arbeit

targets := file1 file2 file3 
CPPFLAGS := -Isome_include_dir 

.PHONY: all 
all: $(targets) 
$(targets): CC := $(CXX) 
$(targets): %: %.o header.o 
%.o: header.h 
+0

Ja! Das hat mein Problem gelöst. Ich dachte darüber nach, dies zu benutzen, war mir aber nicht sicher, wie ich es jetzt funktionierte. Vielen Dank. Ich werde sehen, ob ich Ihnen +1 geben kann, da ich ein neuer Benutzer bin. Wenn nicht, dann tut es mir leid. Danke noch einmal! – Joe

Verwandte Themen