Comment puis-je créer un Makefile pour les projets C avec la SRC, OBJ, et les sous-répertoires BIN?

Il y A quelques mois, je suis venu avec les génériques suivantes Makefile pour des travaux scolaires:

# ------------------------------------------------
# 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!"

Ce sera essentiellement de compiler tous les .c et .h fichier à générer .o fichiers et le fichier exécutable projectname tous dans le même dossier.

Maintenant, j'aimerais pousser un peu. Comment puis-je écrire un Makefile pour compiler un projet C avec la structure de répertoire suivante?

 ./
 ./Makefile
 ./src/*.c;*.h
 ./obj/*.o
 ./bin/<executable>

En d'autres termes, j'aimerais avoir un Makefile qui compile les sources C de ./src/ en ./obj/ et de les lier tous les éléments pour créer l'exécutable dans ./bin/.

J'ai essayé de lire les différents fichiers Makefile, mais je ne peux tout simplement pas faire le travail pour le projet de la structure ci-dessus; au lieu de cela, le projet ne parvient pas à compiler avec toutes sortes d'erreurs. Bien sûr, je pourrais utiliser la pleine soufflé IDE (Monodevelop, Anjuta, etc.), mais honnêtement, je préfère rester avec gEdit et le bon vieux terminal.

Est-il un gourou qui peut me donner une solution ou une information claire sur la façon dont cela peut être fait? Merci!!!!

** Mise à JOUR (v4) **

La solution finale :

# ------------------------------------------------
# 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!"
  • Quelle est la question?
  • Je ne suis pas sûr de comprendre ce que vous voulez faire.
  • Mis à jour le Makefile. Je suis de près, mais j'ai du mal avec les variables automatiques, de sorte qu'il semble de toute façon
  • Je viens de trouver une solution. Si quelqu'un le soin de trouver quelque chose de mieux, le Makefile peut encore être améliorée.
  • n'est-ce pas .BIDON au lieu de .FAUX?
  • il peut être "BANANE" autant que je sache.. d'ailleurs, je ne suis pas un locuteur natif anglais 🙂
  • Je ne veux pas critiquer vos compétences en anglais. Mais pour le FAUX cibles pour donner un sens vous avez très certainement ne peut pas écrire de la BANANE 😉 gnu.org/software/make/manual/html_node/Phony-Targets.html