Makefile找不到对象的规则

时间:2016-05-04 09:31:42

标签: c makefile rule

我有一个关于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 $@

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

我的问题是,如果我尝试使用此Makefile进行编译,则会返回错误消息:

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 $@


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

2 个答案:

答案 0 :(得分:1)

headers.list中的所有文件都出现在正确的位置吗?

顺便说一下,这不是处理标头依赖关系的好方法。您应该查看-MP-MDD以及预处理器的其他选项来生成依赖项。

答案 1 :(得分:0)

一个经典的makefile,应该做你需要的:

.camelize.constantize.skip_callback(:after_create)

如果不清楚,请告诉我。

用法:

undefined method '_after_create_callbacks' for #<Class: