Wie erstelle ich ein einfaches Makefile für gcc unter Linux?

Lesezeit: 5 Minuten

Benutzeravatar von user69514
Benutzer69514

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.

Benutzeravatar von Joey Adams
Joey Adams

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! 🙂

  • Um technisch korrekt zu sein, glaube ich, dass Sie verwenden sollten .PHONY: clean all default für die Ziele, die von der Befehlszeile aus verwendet werden sollen. Auch Autoconf/Automake sind nicht so schlecht. Sicher, sie fühlen sich schrecklich an, und sich an sie zu gewöhnen, macht ungefähr so ​​viel Spaß, als würde man seinen Kopf durch eine Mauer zwingen, aber sie funktionieren, und sie sind gut entwickelt, und sie werden die meisten Ihrer Grundlagen in Bezug auf Tragbarkeit abdecken, und werden dir am Ende das Leben viel einfacher machen, wenn du dich an ihr schreckliches Design gewöhnt hast.

    – Chris Lutz

    28. September 2009 um 0:25 Uhr

  • Ich denke, das funktioniert, aber ich dachte, wenn ich “make” auf dem Terminal eingetippt habe, sollte das Programm laufen. Folgendes bekomme ich: gcc statsh.o -Wall -lm -o prog Ist es möglich, einfach make einzugeben und das Programm auszuführen?

    – Benutzer69514

    28. September 2009 um 0:38 Uhr

  • Warum verwendest du nicht autoconf joey-adams ?

    – Michal Gonda

    1. April 2016 um 12:03 Uhr


  • Falls sich jemand wundert, warum da Bindestriche davor stehen rm: stackoverflow.com/questions/2989465/rm-rf-versus-rm-rf

    – Tor Klingeberg

    22. Mai 2017 um 14:00 Uhr

  • Besser verwenden := Anstatt von =. Mit := das wildcard Funktion wird nur einmal ausgeführt und man kann Variablen später anhängen/erweitern OBJS := $(OBJS) other.o. Mit = dies ist nicht möglich, dies führt zu einer Endlosschleife in der Variablenexpansion! Sehen: Die zwei Arten von Variablen.

    – netzego

    5. November 2021 um 20:14 Uhr


Viliams Benutzeravatar
Viliam

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

  • @user69514: make ohne Argumente normalerweise nur bauen Ihre Software. Um es auszuführen, verwenden Sie entweder make run (verfügbar in dieser Antwort, aber nicht unbedingt in allen Makefiles) oder direkt ausführen: ./program

    – MestreLion

    22. Januar 2015 um 6:23 Uhr

Benutzer-Avatar von anonymous
anonym

all: program
program.o: program.h headers.h

reicht. der Rest ist implizit

  • Und wenn Ihr ganzes Programm ein einziges ist .c Datei, nur program: ist notwendig. Süss 🙂

    – MestreLion

    22. Januar 2015 um 6:14 Uhr


  • Während dies sicherlich einfach ist, kein Zweifel, anonym & @MestreLion , bin ich neu in C und habe erst kürzlich ein großes Projekt in 2 Quelldateien und einen Header aufgeteilt, und das bin ich nicht Verwenden von Makefiles, sondern a sehr einfaches C-Programm, das im Grunde nur verwendet system() aus stdlib.h… Keine Nachteile dieses Ansatzes, oder?

    – AP Jo

    4. September 2020 um 7:09 Uhr

  • @APJo: bei einfachen Projekten kommt man ohne einen davon Makefile und einfach direkt aufrufen gcc *.c *.h -o programmöglicherweise Hinzufügen von Optionen wie -Wall -O2etc.

    – MestreLion

    4. September 2020 um 19:20 Uhr

Benutzeravatar von Indrakumar
Indrakumar

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.

1423850cookie-checkWie erstelle ich ein einfaches Makefile für gcc unter Linux?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy