我正在尝试按照本教程: 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)
我只是没有看到任何错误。请帮忙。
答案 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!