Make不会自动调用我的 "干净 "目标。

问题描述 投票:0回答:2

我也看到过类似的问题,但在我的情况下,给出的答案都没有用。我写了下面的Makefile。

# Compiler to use
CC = gcc

# flags to pass compiler
CFLAGS = -ggdb3 -O0 -std=c99 -Wall -Werror

# Name for the executable
EXE = cuaterniones

# space-separated list of header files
HDRS = cuaternion.h

# space-separated list of libraries, if any,
# each of which should be prefixed with -l
LIBS = -lm

# space-separated list of source files
SRCS = main.c cuaternion.c

# automatically generated list of object files
OBJS = $(SRCS:.c=.o)

# default target
$(EXE): $(OBJS) $(HDRS) Makefile
    $(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS)

# dependencies 
$(OBJS): $(HDRS) Makefile

# housekeeping
clean:
    rm -f *.o

可以推断,我想在编译后删除所有对象文件。但是,当我调用make时,程序被编译了,但对象文件没有被删除。但是,如果我做:make clean,就能如愿以偿。问题是,我看到这应该是自动的,如果我调用make,它应该自动帮我清理文件,这是我想要的。另外,我想知道为什么不工作,我的错误在哪里?

makefile
2个回答
3
投票

首先,它是不寻常的 make clean 以免像大多数人所期望的那样,同时删除可执行文件。 也许你需要一个 clean-obj target,或类似的。 在任何情况下,它都不是自动的,你需要明确地调用它,例如:

$(EXE): $(OBJS) $(HDRS) Makefile
    $(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS)
    $(MAKE) clean

Here $(MAKE) 评估到所使用的make命令 (通常是'make',但也可能是'gmake'或其它)。但是,如上所述,约定俗成的是 make clean 应该删除可执行文件,所以你可能想为一个只删除对象文件的目标使用一个不同的名字。


1
投票

如果你什么都不说,make只会努力做第一个目标,也就是默认目标。

你的 clean target不是第一个目标,不是第一个目标的依赖,也不是命令行中的目标,所以make没有被指示通过它。

可以 通过将它们拆分成这样,让它包含在默认的目标中。

default: $(EXE) clean     # as a first target

但我不建议这样做,这不是一个有意义的依赖关系,而且如果你试图并行运行它,它根本不会工作。

我个人会选择一个工作流程,除非我特别需要,否则我根本不会在构建后进行清理,在这种情况下,我可能会使用一个罐装的 make && make clean 命令行。

另一种方法是将对象文件作为隐含的中间目标来构建--我想GNU make会自动清理这些文件。

© www.soinside.com 2019 - 2024. All rights reserved.