所以我编写了一个程序来计算凯撒密码,但我认为这并不重要 - 重要的是当我尝试执行 make
时,编译器或检查我的 makefile 语法的人是抛出一个错误说:
make: *** No rule to make target 'clean.', needed by 'PHONY'. Stop.
在我的目录中有 5 个文件:
main.c
ceasar.c
ceasar.h
parser.c
parser.h
makefile 看起来像:
PHONY : all clean.
CFLAGS = -c -g -Wall
CXXFLAGS = -o
CC = gcc
OBJECTS = main.o ceasar.o parser.o
EXTRA_SRCS = ceasear.h parser.h
all : ex1
ex1 : $(objects)
$(CC) $(CXXFLAGS) ex1 $(objects)
%.o : %.c $(wildcard $(EXTRA_SRCS))
$(CC) $(CFLAGS) $<
clean:
rm *.o
当键入 make clean
时,makefile 应该清理对象文件
$(wildcard $(EXTRA_SRCS))
行应该检查 c 文件是否有头文件(parser 和 caeser,而不是 main)。
我正在使用 ubuntu 15.10,请帮助我:)
最佳答案
可以指定以执行一系列操作为目的的虚构目标。这些目标没有指定任何依赖关系,也不能作为第一条规则出现,只有当它们作为参数显式传递给 make
命令时才会执行。虚构目标不是文件(该文件不存在),它用于在每种情况下启动命令的执行。
CFLAGS = -c -g -Wall
CXXFLAGS = -o
CC = gcc
OBJECTS = main.o ceasar.o parser.o
EXTRA_SRCS = ceasear.h parser.h
all : ex1
ex1 : $(objects)
$(CC) $(CXXFLAGS) ex1 $(objects)
%.o : %.c $(wildcard $(EXTRA_SRCS))
$(CC) $(CFLAGS) $<
.PHONY: clean
clean: rm *.o
小心因为虚构目标可能被现有文件掩盖:如果不小心在目录中创建了一个与虚构目标同名的文件,因为目标没有依赖项,并且该文件已经存在,该文件不需要更新,那么命令列表将永远不会被执行。
关于c - makefile 出现奇怪的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40931385/