2016-05-04 2 views
1

У меня есть вопрос начинающего о Makefile. У меня есть очень простой Makefile, содержащий:Makefile не находит правила для объекта

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 

Моя проблема, если я пытаюсь использовать этот make-файл для компиляции, он возвращает сообщение об ошибке:

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

Что я делаю неправильно?

После первых замечаний и дальнейших исследований я добрался до этой рабочей версии, но это не создает объектные файлы в папке OBJ, так что это не то, что я стремлюсь к

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

ли 'Name.c' существует, в каталоге верхнего уровня? –

+0

yes, в противном случае makefile не потребует .o для сборки – Thorsten

+0

Есть ли имя.c в вашем файле 'sources.list'? – jdarthenay

ответ

1

ли все файлы в headers.list присутствуют в нужном месте?

Кстати, это не очень хороший способ обработки зависимостей от заголовков. Вы должны взглянуть на -MP и -MDD и другие параметры вашего препроцессора для генерации зависимостей.

0

Классической Makefile, который должен делать то, что вам нужно:

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) 

Если что-то не ясно, дай мне знать.

Использование:

make depends 
make 
Смежные вопросы