Ich habe drei Dateien: program.c
, program.h
und headers.h
.
program.c
beinhaltet program.h
und headers.h
.
Ich muss dies unter Linux mit kompilieren gcc Compiler. Ich bin mir nicht sicher, wie ich das machen soll. Netbeans hat eine für mich erstellt, aber sie ist leer.
Interessant, ich wusste nicht, dass make standardmäßig die vom C-Compiler vorgegebenen Regeln in Bezug auf Quelldateien verwenden würde.
Wie auch immer, 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
(Beachten Sie, dass make einen Tab- statt Leerzeicheneinzug erfordert, also stellen Sie sicher, dass Sie dies beim Kopieren korrigieren.)
Um jedoch mehr C-Dateien zu unterstützen, müssten Sie für jede von ihnen neue Regeln erstellen. Also zur Verbesserung:
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 machen, indem ich Variablen wie $(CC) und $(CFLAGS) weggelassen habe, die normalerweise in Makefiles zu sehen sind. Wenn Sie daran interessiert sind, das herauszufinden, hoffe ich, dass ich Ihnen einen guten Start dafür gegeben habe.
Hier ist das Makefile, das ich gerne für C-Source verwende. Fühlen Sie sich frei, es zu verwenden:
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 Wildcard- und Patsubst-Funktionen des Make-Dienstprogramms, um automatisch .c- und .h-Dateien in das aktuelle Verzeichnis aufzunehmen, was bedeutet, dass Sie das Makefile nicht aktualisieren müssen, wenn Sie Ihrem Verzeichnis neue Codedateien hinzufügen. 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 nicht autoconf. Ich flehe dich an! 🙂
Zum Beispiel sollte dieses einfache Makefile ausreichen:
CC=gcc
CFLAGS=-Wall
all: program
program: program.o
program.o: program.c program.h headers.h
clean:
rm -f program program.o
run: program
./program
Beachten Sie, dass es sein muss <tab>
in der nächsten Zeile nach clean und run, keine Leerzeichen.
AKTUALISIEREN Kommentare unten angewendet
all: program
program.o: program.h headers.h
reicht. der Rest ist implizit
Die einfachste Make-Datei kann sein
all : test
test : test.o
gcc -o test test.o
test.o : test.c
gcc -c test.c
clean :
rm test *.o
Abhängig von der Anzahl der Header und Ihren Entwicklungsgewohnheiten sollten Sie gccmakedep untersuchen. Dieses Programm untersucht Ihr aktuelles Verzeichnis und fügt am Ende des Makefiles die Header-Abhängigkeiten für jede .c/cpp-Datei hinzu. Das ist übertrieben, wenn Sie 2 Header und eine Programmdatei haben. Wenn Sie jedoch mehr als 5 kleine Testprogramme haben und einen von 10 Headern bearbeiten, können Sie sich darauf verlassen, dass make genau die Programme wiederherstellt, die durch Ihre Änderungen geändert wurden.
Es gibt eine äußerst elegante (und gut dokumentierte) Lösung unter spin.atomicobject.com/2016/08/26/makefile-c-projects.
– Casey
3. Mai 2018 um 8:16 Uhr