Vor ein paar Monaten kam ich auf das folgende Generikum Makefile
für Schulaufgaben:
# ------------------------------------------------
# Generic Makefile
#
# Author: [email protected]
# Date : 2010-11-05
#
# Changelog :
# 0.01 - first version
# ------------------------------------------------
# project name (generate executable with this name)
TARGET = projectname
CC = gcc -std=c99 -c
# compiling flags here
CFLAGS = -Wall -I.
LINKER = gcc -o
# linking flags here
LFLAGS = -Wall
SOURCES := $(wildcard *.c)
INCLUDES := $(wildcard *.h)
OBJECTS := $(SOURCES:.c=*.o)
rm = rm -f
$(TARGET): obj
@$(LINKER) $(TARGET) $(LFLAGS) $(OBJECTS)
@echo "Linking complete!"
obj: $(SOURCES) $(INCLUDES)
@$(CC) $(CFLAGS) $(SOURCES)
@echo "Compilation complete!"
clean:
@$(rm) $(TARGET) $(OBJECTS)
@echo "Cleanup complete!"
Dies wird im Grunde jede kompilieren .c
und .h
Datei zu generieren .o
Dateien und die ausführbare Datei projectname
alles im selben Ordner.
Nun, ich möchte das ein wenig vorantreiben. Wie kann ich ein Makefile schreiben, um ein C-Projekt mit der folgenden Verzeichnisstruktur zu kompilieren?
./
./Makefile
./src/*.c;*.h
./obj/*.o
./bin/<executable>
Mit anderen Worten, ich hätte gerne ein Makefile, aus dem C-Quellen kompiliert werden ./src/
hinein ./obj/
und verknüpfen Sie dann alles, um die ausführbare Datei zu erstellen ./bin/
.
Ich habe versucht, verschiedene Makefiles zu lesen, aber ich kann sie einfach nicht für die obige Projektstruktur zum Laufen bringen; Stattdessen kann das Projekt nicht mit allen möglichen Fehlern kompiliert werden. Sicher, ich könnte eine vollwertige IDE (Monodevelop, Anjuta usw.) verwenden, aber ich bleibe ehrlich gesagt lieber bei gEdit und dem guten alten Terminal.
Gibt es einen Guru, der mir eine funktionierende Lösung oder klare Informationen darüber geben kann, wie dies bewerkstelligt werden kann? Vielen Dank!
** AKTUALISIEREN (v4) **
Das finale Resultat :
# ------------------------------------------------
# Generic Makefile
#
# Author: [email protected]
# Date : 2011-08-10
#
# Changelog :
# 2010-11-05 - first version
# 2011-08-10 - added structure : sources, objects, binaries
# thanks to http://stackoverflow.com/users/128940/beta
# 2017-04-24 - changed order of linker params
# ------------------------------------------------
# project name (generate executable with this name)
TARGET = projectname
CC = gcc
# compiling flags here
CFLAGS = -std=c99 -Wall -I.
LINKER = gcc
# linking flags here
LFLAGS = -Wall -I. -lm
# change these to proper directories where each file should be
SRCDIR = src
OBJDIR = obj
BINDIR = bin
SOURCES := $(wildcard $(SRCDIR)/*.c)
INCLUDES := $(wildcard $(SRCDIR)/*.h)
OBJECTS := $(SOURCES:$(SRCDIR)/%.c=$(OBJDIR)/%.o)
rm = rm -f
$(BINDIR)/$(TARGET): $(OBJECTS)
@$(LINKER) $(OBJECTS) $(LFLAGS) -o $@
@echo "Linking complete!"
$(OBJECTS): $(OBJDIR)/%.o : $(SRCDIR)/%.c
@$(CC) $(CFLAGS) -c $< -o $@
@echo "Compiled "$<" successfully!"
.PHONY: clean
clean:
@$(rm) $(OBJECTS)
@echo "Cleanup complete!"
.PHONY: remove
remove: clean
@$(rm) $(BINDIR)/$(TARGET)
@echo "Executable removed!"
Was ist hier die konkrete Frage?
– Oliver Charlesworth
10. August 2011 um 0:44 Uhr
Ich bin mir nicht sicher, ob ich verstehe, was Sie tun möchten.
– Tom
10. August 2011 um 0:44 Uhr
Aktualisiert die
Makefile
. Ich bin nah dran, aber ich habe Probleme mit den automatischen Variablen, so scheint es jedenfalls– Yanik Rochon
10. August 2011 um 3:06 Uhr
Ich habe gerade eine Lösung gefunden. Wenn jemand etwas Besseres finden möchte, kann das Makefile noch verbessert werden.
– Yanik Rochon
10. August 2011 um 4:05 Uhr
@YanickRochon Ich wollte deine Englischkenntnisse nicht kritisieren. Aber damit die PHONY-Ziele einen Sinn ergeben, können Sie definitiv nicht BANANA schreiben;) gnu.org/software/make/manual/html_node/Phony-Targets.html
– Joni
10. März 2016 um 5:54 Uhr