c - makefile 出现奇怪的错误

标签 c linux makefile

所以我编写了一个程序来计算凯撒密码,但我认为这并不重要 - 重要的是当我尝试执行 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/

相关文章:

c++ - 仅读取数字的 scanf 格式说明符

c - 二项式系数舍入误差

c - "scanf("%d",&a[i])"是什么意思?

linux - 如何通过 Grunt 将 Angular 应用程序部署到 CentOS?

makefile - 在 makefile 中 CC 和 LD 代表什么?

c++ - glGenBuffers 没有定义?

c - 在 Linux 上的 valgrind 中有内存泄漏的 C 程序,但我已经从 malloc() 中释放了内存

linux - Lua允许删除CS2D游戏中的文件

makefile - GNU Make 中的互斥量?

c - 非常基本的 makefile linux