Makefile zum Kompilieren mehrerer C-Programme?

Lesezeit: 6 Minuten

Benutzeravatar von Sarah
Sarah

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

program1:
    gcc -o prog1 program1.c

program2:
    gcc -o prog2 program2.c

Alle Beispiele online gehen viel mehr ins Detail als ich brauche und sind verwirrend! Alles, was ich wirklich will, ist, die beiden laufen zu lassen gcc Linien. Was mache ich falsch?

  • Die Antworten unten sind sehr klar, aber Sie können auch einfach die Befehlszeile ausführen: make program1 program2 das wird beide Ziele in genau dem Beispiel aufrufen, das Sie selbst gegeben haben. Wenn Sie nur wollen program1du kannst einfach laufen make (es wird das erste Ziel ausführen). Wenn Sie nur wollen program2Lauf make program2. Sie haben mehr Kontrolle. Und natürlich ein Ziel all: program1 program2 wird genau das tun (als erstes, Ihre 2 anderen Ziele ausführen). Fertig.

    – DrBeco

    16. Juni 2016 um 5:31 Uhr

Mach es so

all: program1 program2

program1: program1.c
    gcc -o program1 program1.c

program2: program2.c
    gcc -o program2 program2.c

Sie sagten, Sie wollen keine fortgeschrittenen Sachen, aber Sie könnten es auch so kürzen, basierend auf einigen Standardregeln.

all: program1 program2

program1: program1.c
program2: program2.c

  • Beachten Sie, dass, wenn Sie möchten, dass beide Programme automatisch erstellt werden, die all target muss vor den einzelnen Programmen im Makefile stehen und das erste Ziel im Makefile sein.

    – Randall Cook

    8. Januar 2014 um 2:15 Uhr

  • Du kannst Geben all oder ein beliebiges anderes Ziel, wo immer Sie möchten, und machen Sie es zum Standard für ziellose (was Sie “automatisch” nennen) Läufe make verwenden .DEFAULT_GOAL:=all.

    – Unterstrich_d

    19. September 2015 um 21:08 Uhr


Benutzeravatar von hmofrad
hmofrad

Musterregeln können Sie mehrere c-Dateien kompilieren, die dieselben Kompilierungsbefehle erfordern make folgendermaßen:

objects = program1 program2
all: $(objects)

$(objects): %: %.c
        $(CC) $(CFLAGS) -o $@ $<

  • Was ist, wenn Sie anstelle von Programm1 und Programm2 Tausende von „.c“-Dateien in verschiedenen Verzeichnissen und Unterverzeichnissen haben? Wie können wir dasselbe mit der obigen Logik automatisieren?

    – SCH’

    22. Januar 2021 um 16:19 Uhr

  • @SH’ Make verwenden shell Befehl zum Auffüllen objects unter Verwendung der Ausgabe von find. Z.B, objects := $(shell find . -type f -iname "*.c" -print | tr -d ".c" | sed 's/\///')

    – hmofrad

    22. Januar 2021 um 18:33 Uhr


  • Eine @hmofrad-Antwort mit ‘tr’ entfernt alle übereinstimmenden Zeichen [‘.’, ‘c’], kein Teilstring. Fix: find tests/ -type f -iname '*.cpp' | sed 's/.cpp//g'

    – Ben Crowhurst

    1. Juli 2021 um 3:47 Uhr


Benutzeravatar von Robert
Robert

############################################################################
# 'A Generic Makefile for Building Multiple main() Targets in $PWD'
# Author:  Robert A. Nader (2012)
# Email: naderra at some g
# Web: xiberix
############################################################################
#  The purpose of this makefile is to compile to executable all C source
#  files in CWD, where each .c file has a main() function, and each object
#  links with a common LDFLAG.
#
#  This makefile should suffice for simple projects that require building
#  similar executable targets.  For example, if your CWD build requires
#  exclusively this pattern:
#
#  cc -c $(CFLAGS) main_01.c
#  cc main_01.o $(LDFLAGS) -o main_01
#
#  cc -c $(CFLAGS) main_2..c
#  cc main_02.o $(LDFLAGS) -o main_02
#
#  etc, ... a common case when compiling the programs of some chapter,
#  then you may be interested in using this makefile.
#
#  What YOU do:
#
#  Set PRG_SUFFIX_FLAG below to either 0 or 1 to enable or disable
#  the generation of a .exe suffix on executables
#
#  Set CFLAGS and LDFLAGS according to your needs.
#
#  What this makefile does automagically:
#
#  Sets SRC to a list of *.c files in PWD using wildcard.
#  Sets PRGS BINS and OBJS using pattern substitution.
#  Compiles each individual .c to .o object file.
#  Links each individual .o to its corresponding executable.
#
###########################################################################
#
PRG_SUFFIX_FLAG := 0
#
LDFLAGS := 
CFLAGS_INC := 
CFLAGS := -g -Wall $(CFLAGS_INC)
#
## ==================- NOTHING TO CHANGE BELOW THIS LINE ===================
##
SRCS := $(wildcard *.c)
PRGS := $(patsubst %.c,%,$(SRCS))
PRG_SUFFIX=.exe
BINS := $(patsubst %,%$(PRG_SUFFIX),$(PRGS))
## OBJS are automagically compiled by make.
OBJS := $(patsubst %,%.o,$(PRGS))
##
all : $(BINS)
##
## For clarity sake we make use of:
.SECONDEXPANSION:
OBJ = $(patsubst %$(PRG_SUFFIX),%.o,$@)
ifeq ($(PRG_SUFFIX_FLAG),0)
        BIN = $(patsubst %$(PRG_SUFFIX),%,$@)
else
        BIN = $@
endif
## Compile the executables
%$(PRG_SUFFIX) : $(OBJS)
    $(CC) $(OBJ)  $(LDFLAGS) -o $(BIN)
##
## $(OBJS) should be automagically removed right after linking.
##
veryclean:
ifeq ($(PRG_SUFFIX_FLAG),0)
    $(RM) $(PRGS)
else
    $(RM) $(BINS)
endif
##
rebuild: veryclean all
##
## eof Generic_Multi_Main_PWD.makefile

  • 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, oder es zeigt “make: Nothing to be done for `all’.” wobei tatsächlich Änderungen in der .h-Datei vorgenommen wurden. Können wir die Make-Datei so ändern, dass sie nach Änderungen in .h-Dateien kompiliert wird, ohne die .c-Datei erneut zu speichern? und danke für den obigen code!!!

    – jatin3893

    3. Februar 2013 um 15:09 Uhr

  • Vielen Dank. Das war sehr nützlich für mich 🙂

    – SCHRI

    29. Juli 2013 um 14:26 Uhr

  • Danke, das habe ich gesucht!

    – Alejandro Alcalde

    23. März 2014 um 10:14 Uhr

  • “$(OBJS) sollte direkt nach dem Verknüpfen automatisch entfernt werden.” Führt das nicht zu einer unnötigen Neukompilierung und vereitelt damit meistens den Sinn von make?

    – Unterstrich_d

    19. September 2015 um 21:07 Uhr

  • Warum brauchst du .SECONDEXPANSION?

    – Crisron

    16. Juli 2016 um 10:19 Uhr

all: program1 program2

program1:
    gcc -Wall -o prog1 program1.c

program2:
    gcc -Wall -o prog2 program2.c

all: program1 program2

program1:
    gcc -Wall -ansi -pedantic -o prog1 program1.c

program2:
    gcc -Wall -ansi -pedantic -o prog2 program2.c

Ich bevorzuge die Ansi und Pedantik, eine bessere Kontrolle für dein Programm. Es lässt Sie nicht kompilieren, solange Sie noch Warnungen haben !!

  • Das ist nicht was -pedantic ist für. -pedantic wird sogar alle Nicht-ANSI-Funktionen entfernen -ansi Genehmigungen.

    – Cnicutar

    10. Mai 2011 um 13:15 Uhr

  • Um den Kommentar von cnicutar zu ergänzen, -Werror wandelt Warnungen in Fehler um.

    – jtniehof

    10. Mai 2011 um 14:09 Uhr

Benutzeravatar von ern0
ern0

Der Kompilierungs-Workflow eines einfachen Programms ist einfach, ich kann es als kleine Grafik zeichnen: Quelle -> [compilation] -> Objekt [linking] -> ausführbar. Es gibt Dateien (Quelle, Objekt, ausführbare Datei) in diesem Diagramm und Regeln (machenTerminologie von ). Dieser Graph ist in definiert Makefile.

Wenn Sie make starten, wird es angezeigt Makefileund prüft auf geändert Dateien. Wenn es welche gibt, löst es die aus Regel, was davon abhängt. Das Regel kann weiter produzieren/aktualisieren Dateiendie andere auslösen können Regeln usw. Wenn Sie ein gutes Makefile erstellen, nur das Notwendige Regeln (Compiler/Link-Kommandos) ausgeführt wird, was aus der modifizierten Datei im Abhängigkeitspfad “to next” steht.

Wählen Sie ein Beispiel aus Makefilelesen Sie das Handbuch für die Syntax (wie auch immer, es ist auf den ersten Blick klar, ohne Handbuch), und Zeichnen Sie die Grafik. Sie müssen Compiler-Optionen 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 tun)! Du kannst sagen machenwelche Regel ist Ihre Zielalso nur der Linksstehende Dateien werden als Trigger verwendet.

Wieder: Zeichnen Sie die Grafik!.

  • Das ist nicht was -pedantic ist für. -pedantic wird sogar alle Nicht-ANSI-Funktionen entfernen -ansi Genehmigungen.

    – Cnicutar

    10. Mai 2011 um 13:15 Uhr

  • Um den Kommentar von cnicutar zu ergänzen, -Werror wandelt Warnungen in Fehler um.

    – jtniehof

    10. Mai 2011 um 14:09 Uhr

SRC = a.cpp b.cpp
BIN = $(patsubst %.cpp,%,$(SRC))

all: $(BIN)

clean:
    rm -f $(BIN)

.PHONY: all clean

make all Wird besorgt:

c++     a.cpp   -o a
c++     b.cpp   -o b

Wenn Sie einstellen CXX und CXXFLAGS Variablen make werde sie verwenden.

  • Meinten Sie a.cpp -o a?

    – Shane Abraham Mendez

    9. März 2017 um 22:14 Uhr

1418560cookie-checkMakefile zum Kompilieren mehrerer C-Programme?

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

Privacy policy