Interessanterweise wusste ich nicht, dass make standardmäßig den C-Compiler verwenden würde, wenn Regeln für Quelldateien festgelegt wurden.
Eine einfache Lösung, die einfache Makefile-Konzepte demonstriert, wäre:
HEADERS = program.h headers.h
default: program
program.o: program.c $(HEADERS)
gcc -c program.c -o program.o
program: program.o
gcc program.o -o program
clean:
-rm -f program.o
-rm -f program
(Denken Sie daran, dass make eine Registerkarte anstelle einer Leerzeicheneinrückung erfordert. Korrigieren Sie dies daher beim Kopieren.)
Um jedoch mehr C-Dateien zu unterstützen, müssten Sie für jede neue Regeln erstellen. So verbessern:
HEADERS = program.h headers.h
OBJECTS = program.o
default: program
%.o: %.c $(HEADERS)
gcc -c $< -o $@
program: $(OBJECTS)
gcc $(OBJECTS) -o $@
clean:
-rm -f $(OBJECTS)
-rm -f program
Ich habe versucht, dies so einfach wie möglich zu gestalten, indem ich Variablen wie $ (CC) und $ (CFLAGS) weggelassen habe, die normalerweise in Makefiles angezeigt werden. Wenn Sie daran interessiert sind, das herauszufinden, hoffe ich, dass ich Ihnen einen guten Start gegeben habe.
Hier ist das Makefile, das ich gerne für die C-Quelle verwende. Fühlen Sie sich frei, es zu benutzen:
TARGET = prog
LIBS = -lm
CC = gcc
CFLAGS = -g -Wall
.PHONY: default all clean
default: $(TARGET)
all: default
OBJECTS = $(patsubst %.c, %.o, $(wildcard *.c))
HEADERS = $(wildcard *.h)
%.o: %.c $(HEADERS)
$(CC) $(CFLAGS) -c $< -o $@
.PRECIOUS: $(TARGET) $(OBJECTS)
$(TARGET): $(OBJECTS)
$(CC) $(OBJECTS) -Wall $(LIBS) -o $@
clean:
-rm -f *.o
-rm -f $(TARGET)
Es verwendet die Platzhalter- und Patsubst-Funktionen des Dienstprogramms make, um automatisch .c- und .h-Dateien in das aktuelle Verzeichnis aufzunehmen. Wenn Sie also neue Codedateien zu Ihrem Verzeichnis hinzufügen, müssen Sie das Makefile nicht aktualisieren. Wenn Sie jedoch den Namen der generierten ausführbaren Datei, Bibliotheken oder Compiler-Flags ändern möchten, können Sie einfach die Variablen ändern.
Verwenden Sie in beiden Fällen bitte keine automatische Konfiguration. Ich flehe dich an! :) :)