没有规则来制定目标

时间:2015-05-25 17:54:36

标签: c makefile gnu-make

我正在尝试按照本教程: http://www.cs.colby.edu/maxwell/courses/tutorials/maketutor/

当我在最后一个makefile(#5)时," make"不能继续(错误提示)No rule to make target "obj/hellomake.o", needed by "hellomake"。这段代码试图编译源文件,并将libs,srcs,objs放入相应的文件夹中。

IDIR =../include
CC=gcc
CFLAGS=-I$(IDIR)

ODIR=obj
LDIR =../lib

LIBS=-lm

_DEPS = hellomake.h
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))

_OBJ = hellomake.o hellofunc.o 
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))


$(ODIR)/%.o: %.c $(DEPS)
    $(CC) -c -o $@ $< $(CFLAGS)

hellomake: $(OBJ)
    gcc -o $@ $^ $(CFLAGS) $(LIBS)

.PHONY: clean

clean:
    rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~  

我已经盯着它看了一个小时,它不是一段复杂的代码,但我无法解决这个问题。我怀疑问题发生在这里:

$(ODIR)/%.o: %.c $(DEPS)
    $(CC) -c -o $@ $< $(CFLAGS)

hellomake: $(OBJ)
    gcc -o $@ $^ $(CFLAGS) $(LIBS)

我只是没有看到任何错误。请帮忙。

2 个答案:

答案 0 :(得分:6)

他们的剧本很好!就这样做:

1°)创建目录“include”和“src”

mkdir include; mkdir src

2°)在“src”

中创建一个“obj”文件夹
mkdir obj

3°)您的目录树应如下所示:

$:~/parentDir$ tree
.
├── include
│   └── hellomake.h
└── src
    ├── hellofunc.c
    ├── hellomake
    ├── hellomake.c
    ├── Makefile
    └── obj
        ├── hellofunc.o
        └── hellomake.o

4°)现在只需在 src 目录中使用 make 命令。  :d

答案 1 :(得分:2)

如果您没有名为hellomake.c的源文件,则make不知道如何制作obj/hellomake.o。您还应该自己创建obj目录,因为您没有在Makefile中执行此操作的命令,但是它的缺失不会导致您报告的错误。

你可能知道的更好,解释可能更微妙:

我怀疑在这一行的开头有一个缺少的TAB字符:

$(CC) -c -o $@ $< $(CFLAGS)

命令由Makefile中的TAB字符引入,而不是空格。这很不幸,但似乎没有人愿意解决这个问题。

我记得1984年在贝尔实验室与斯图尔特费尔德曼会面时:他被介绍给我作为的发明者。在我说什么之前,他立即就这样道歉:我知道,抱歉他是TAB!