【发布时间】:2016-05-04 09:31:42
【问题描述】:
我有一个关于 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
我做错了什么?
经过最初的几个 cmets 和进一步的研究,我得到了这个工作版本,但它不会在 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
【问题讨论】:
-
顶级目录中是否存在
Name.c? -
是的,否则makefile不需要构建.o
-
你的
sources.list文件中有name.c吗? -
目前还没有解决问题,
-lm应该在变量LD_FLAGS中,而不是CFLAGS。 -
在您当前的
all规则中将all替换为$(BUILDDIR)/$(EXEC)。在没有命令的情况下添加all规则:all:$(BUILDDIR)/$(EXEC),并添加.PHONY指令:.PHONY:all clean。.PHONY设置不是实际文件的目标列表。