Makefile zum Kompilieren mehrerer C-Programme?

71

Dies ist eine unglaublich einfache Frage, aber ich bin neu in Makefiles. Ich versuche ein Makefile zu erstellen, das zwei unabhängige Programme kompiliert:

Alle Online-Beispiele enthalten mehr Details als ich brauche und sind verwirrend! Ich möchte nur, dass die beiden gccZeilen ausgeführt werden. Was mache ich falsch?

Sarah
quelle
3
Die Antworten unten sind sehr klar, aber Sie können auch einfach die Befehlszeile ausführen: make program1 program2Dadurch werden beide Ziele in dem Beispiel aufgerufen, das Sie sich selbst gegeben haben. Wenn Sie nur möchten program1, können Sie nur ausführen make(es wird das erste Ziel ausgeführt). Wenn Sie nur wollen program2, laufen Sie make program2. Sie haben mehr Kontrolle. Und natürlich wird ein Ziel all: program1 program2genau das tun (es ist das erste, das Ihre 2 anderen Ziele ausführt). Getan.
DrBeco

Antworten:

79

Mach es so

Sie sagten, Sie möchten keine fortgeschrittenen Inhalte, aber Sie könnten sie auch basierend auf einigen Standardregeln so kürzen.

cnicutar
quelle
6
Beachten Sie, dass, wenn beide Programme automatisch erstellt werden sollen, das allZiel vor den einzelnen Programmen im Makefile angezeigt werden muss und das erste Ziel im Makefile sein muss.
Randall Cook
3
Sie können ein allbeliebiges anderes Ziel platzieren oder festlegen und es zum Standard für ziellose (was Sie als "automatisch" bezeichnet haben) Läufe makeverwenden .DEFAULT_GOAL:=all.
underscore_d
28

Mit Musterregeln können Sie mehrere c-Dateien kompilieren, für die dieselben Kompilierungsbefehle erforderlich sind, und zwar makewie folgt:

hmofrad
quelle
24
Robert
quelle
1
Danke für den obigen Code. Ich benutze es, um meine .c-Dateien zu kompilieren. Aber wenn ich eine meiner myHeader.h-Dateien ändere, muss ich die .c-Datei erneut speichern, bevor ich 'make' verwende. Andernfalls wird "make: Nichts für 'alle' zu tun" angezeigt. Während tatsächlich Änderungen in der .h-Datei vorgenommen wurden. Können wir die make-Datei so ändern, dass sie nach Änderungen an .h-Dateien kompiliert wird, ohne die .c-Datei erneut zu speichern? und danke für den obigen Code !!!
jatin3893
Vielen Dank. Das war sehr nützlich für mich :)
SHRI
Danke, das habe ich gesucht!
ElBaulP
4
"$ (OBJS) sollte direkt nach dem Verknüpfen automatisch entfernt werden." Führt das nicht zu einer unnötigen Neukompilierung und besiegt damit meistens den Punkt von make?
underscore_d
Warum brauchst du .SECONDEXPANSION?
Crisron
10
Erik
quelle
2

Ich eher die ansi und pedantisch, eine bessere Kontrolle für Ihr Programm. Sie können nicht kompilieren, solange Sie noch Warnungen haben !!

Meister C.
quelle
2
Dafür ist nicht da -pedantic. -pedanticentfernt alle Nicht-Ansi-Funktionen, die dies sogar zulassen -ansi.
Cnicutar
3
Um den Kommentar von cnicutar zu ergänzen, -Werrorwerden Warnungen in Fehler geändert.
Jtniehof
1

Der Kompilierungsworkflow eines einfachen Programms ist einfach. Ich kann ihn als kleines Diagramm zeichnen: Quelle -> [Kompilierung] -> Objekt [Verknüpfung] -> ausführbare Datei. In diesem Diagramm befinden sich Dateien (Quelle, Objekt, ausführbare Datei) und Regeln ( Terminologie von make ). Dieses Diagramm wird im Makefile definiert .

Wenn Sie make starten, wird Makefile gelesen und nach geänderten Dateien gesucht . Wenn es welche gibt, löst es die Regel aus , die davon abhängt. Die Regel kann weitere Dateien erzeugen / aktualisieren , wodurch andere Regeln usw. ausgelöst werden können . Wenn Sie ein gutes Makefile erstellen, werden nur die erforderlichen Regeln (Compiler- / Link-Befehle) ausgeführt, die aus der geänderten Datei im Abhängigkeitspfad "zum nächsten" stehen.

Wählen Sie ein Beispiel- Makefile aus , lesen Sie das Handbuch für die Syntax (es ist auf den ersten Blick klar, ohne Handbuch) und zeichnen Sie das Diagramm . Sie müssen die Compileroptionen verstehen, um die Namen der Ergebnisdateien herauszufinden.

Das Make-Diagramm sollte so komplex sein, wie Sie möchten. Sie können sogar Endlosschleifen machen (nicht machen)! Sie können make mitteilen , welche Regel Ihr Ziel ist , sodass nur die links stehenden Dateien als Auslöser verwendet werden.

Nochmals: Zeichnen Sie die Grafik !

ern0
quelle
1

Dadurch werden alle *.cDateien makezu ausführbaren Dateien ohne die .cErweiterung wie in kompiliert gcc program.c -o program.

makefügt automatisch alle Flags hinzu, die Sie hinzufügen CFLAGSmöchten CFLAGS = -g Wall.

Wenn Sie keine Flags benötigen, CFLAGSkönnen Sie diese leer lassen (siehe unten) oder ganz weglassen.

M3RS
quelle
0

make all Wird besorgt:

Wenn Sie setzen CXXund CXXFLAGSVariablen makeverwenden sie.

Mischa Tavkhelidze
quelle
2
Meinten Sie a.cpp -o a?
Shane Abram Mendez