没有制定目标的规则
No rule to make target
我正在尝试按照本教程进行操作:
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)
我只是没有发现任何问题。请帮忙。
如果您没有名为 hellomake.c
的源文件,make 不知道如何制作 obj/hellomake.o
。您还应该自己创建 obj
目录,因为您在 Makefile 中没有这样做的命令,但它的缺失不会导致您报告的错误。
你可能知道得更多,解释可能更微妙:
我怀疑这一行的开头缺少一个制表符:
$(CC) -c -o $@ $< $(CFLAGS)
命令是由 Makefile 中的 TAB 字符引入的,而不是空格。很不幸,但似乎没有人想解决这个问题。
我记得 1984 年在贝尔实验室遇到 Stuart Feldman:他被介绍给我是 make 的发明者。在我说什么之前,他迅速这样道歉:我知道,对不起他的标签!
他们的剧本不错!只需这样做:
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
我正在尝试按照本教程进行操作: 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)
我只是没有发现任何问题。请帮忙。
如果您没有名为 hellomake.c
的源文件,make 不知道如何制作 obj/hellomake.o
。您还应该自己创建 obj
目录,因为您在 Makefile 中没有这样做的命令,但它的缺失不会导致您报告的错误。
你可能知道得更多,解释可能更微妙:
我怀疑这一行的开头缺少一个制表符:
$(CC) -c -o $@ $< $(CFLAGS)
命令是由 Makefile 中的 TAB 字符引入的,而不是空格。很不幸,但似乎没有人想解决这个问题。
我记得 1984 年在贝尔实验室遇到 Stuart Feldman:他被介绍给我是 make 的发明者。在我说什么之前,他迅速这样道歉:我知道,对不起他的标签!
他们的剧本不错!只需这样做:
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