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?


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.


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:


24

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

2

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


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 !


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.


0

make all Wird besorgt:

Wenn Sie setzen CXXund CXXFLAGSVariablen makeverwenden sie.


2
Meinten Sie a.cpp -o a?
Shane Abram Mendez
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.