2016-05-04 18 views
1

Ich habe eine Anfängerfrage zu einem Makefile. Ich habe eine sehr einfache Make-Datei enthält:Makefile findet keine Regel für Objekt

SHELL = /bin/sh 
CC = gcc 
CFLAGS = -lm -std=c99 -g -o0 
EXEC = test 
BUILDDIR = build 
OBJDIR = obj 
SOURCES = $(shell cat sources.list) 
DEPS = $(shell cat headers.list) 
OBJ = $(SOURCES:.c=.o) 
OBJECTS = $(patsubst %,$(OBJDIR)/%,$(OBJ)) 

all: $(OBJECTS) 
    $(CC) $(CFLAGS) $(OBJECTS) -o $(BUILDDIR)/$(EXEC) 

$(OBJDIR)/%.o: %.c $(DEPS) 
    $(CC) -c $< -o [email protected] 

clean: 
    rm -f $(BUILDDIR)/$(EXEC) $(OBJDIR)/*.o 

Mein Problem ist, wenn ich versuche, dieses Makefile zu verwenden, um zu kompilieren, es gibt die Fehlermeldung:

there is no rule for the target obj/Name.o 

Was mache ich falsch?

Nach den ersten paar Kommentare und weitere Forschung, die ich auf diese Arbeits Version bekam, aber es schafft nicht die Objektdateien im obj Ordner, so ist es nicht, was ich wollen für

SHELL = /bin/sh 
CC = gcc 
CFLAGS = -lm -std=c99 -g -o0 
EXEC = test 
BUILDDIR = build 
OBJDIR = obj 
SOURCES = $(shell cat sources.list) 
DEPS = $(shell cat headers.list) 
OBJ = $(SOURCES:.c=.o) 
OBJECTS = $(patsubst %,$(OBJDIR)/%,$(OBJ)) 

all: $(BUILDDIR)/$(EXEC) 

$(BUILDDIR)/$(EXEC): $(OBJ) 
$(CC) $(CFLAGS) $(OBJ) -o $(BUILDDIR)/$(EXEC) 

%.o: %.c $(DEPS) 
$(CC) -c $< -o [email protected] 


clean: 
rm -f $(BUILDDIR)/$(EXEC) $(OBJDIR)/*.o 
+0

Ist 'Name.c' existiert, in dem Top-Level-Verzeichnis? –

+0

ja, sonst würde das Makefile das .o nicht erfordern – Thorsten

+0

Gibt es name.c in Ihrer 'sources.list' Datei? – jdarthenay

Antwort

1

alle Sind die Dateien in headers.list am richtigen Ort vorhanden?

Übrigens ist dies keine gute Möglichkeit, Abhängigkeiten von Headern zu behandeln. Sie sollten einen Blick auf -MP und -MDD und andere Optionen Ihres Präprozessors werfen, um Abhängigkeiten zu generieren.

0

Eine klassische Make-Datei, die tun soll, was Sie brauchen:

SHELL=/bin/bash 
CC=gcc 
CFLAGS=-std=c99 -g -o0 
LDFLAGS=-lm 
EXEC=test 
BUILDDIR=build/ 
OBJDIR=obj/ 
SOURCES=$(shell cat sources.list) 
OBJECTS=$(patsubst %.c,$(OBJDIR)%.o,$(notdir $(SOURCES))) 

vpath %.c $(sort $(dir $(SOURCES))) 

.PHONY:all mrproper clean depends 

all:$(BUILDDIR)$(EXEC) 

$(BUILDDIR)$(EXEC):$(OBJECTS)|$(BUILDDIR) 
    $(CC) $(CFLAGS) $^ -o [email protected] $(LDFLAGS) 

$(OBJDIR)%.o:%.c|$(OBJDIR) 
    $(CC) -c $< -o [email protected] 

$(BUILDDIR) $(OBJDIR): 
    mkdir [email protected] 

mrproper:clean 
    rm -f $(BUILDDIR)$(EXEC) 

clean: 
    rm -f $(OBJECTS) 

depends: 
    @rm -f dependencies.mk 
    @for i in $(SOURCES); do $(CC) -MM $$i -MT $(OBJDIR)`basename $$i | sed s:.c$$:.o:` >> dependencies.mk; done 

include $(wildcard dependencies.mk) 

Wenn etwas nicht klar ist, lassen Sie mich wissen.

Verbrauch:

make depends 
make