【问题标题】:Makefile doesn't clean object filesMakefile 不清理目标文件
【发布时间】:2014-10-24 17:50:47
【问题描述】:

这是生成文件:

OBJS    = main.o    hashFunction.o input.o list.o   list_inverted_index.o   memory.o    operations.o    sort.o
SOURCE  = main.c    hashFunction.c input.c list.c   list_inverted_index.c   memory.c    operations.c    sort.c
HEADER  = hashFunction.h input.h list.h list_inverted_index.h   memory.h    operations.h    sort.h
OUT     = myexe
CC  = gcc
FLAGS   = -g -c -Wall
# -g option enables debugging mode 
# -c flag generates object code for separate files

all: $(OBJS)
    $(CC) -g $(OBJS) -o $(OUT)

# create/compile the individual files >>separately<< 
main.o: main.c
    $(CC) $(FLAGS) main.c

hashFunction.o: hashFunction.c
    $(CC) $(FLAGS) hashFunction.c

input.o: input.c
    $(CC) $(FLAGS) input.c

list.o: list.c
    $(CC) $(FLAGS) list.c

list_inverted_index.o: list_inverted_index.c
    $(CC) $(FLAGS) list_inverted_index.c

memory.o: memory.c
    $(CC) $(FLAGS) memory.c

operations.o: operations.c
    $(CC) $(FLAGS) operations.c

sort.o: sort.c
    $(CC) $(FLAGS) sort.c


# clean house
clean:
    rm -f $(OBJS) $(OUT)

# do a bit of accounting
count:
    wc $(SOURCE) $(HEADER)

我尝试将此*.o 附加到干净部分(因为this 的答案),但它不起作用。

【问题讨论】:

  • 清洁目标不会自动触发。您必须在需要时明确使用它:$ make clean

标签: c makefile


【解决方案1】:

你可能缺少一个

.PHONY: all clean count

规则。 .PHONY: target 和规则应该出现在 Makefile 的开头附近,就在变量定义之后(在您的情况下,在 FLAGS 的定义下方)。 如果您碰巧有allclean 文件(在终端中使用ls -l clean all 检查),您需要使用rm 删除它们

您将使用make clean 命令进行清理。

有关有用提示,另请参阅 this answer(关于 remake -xmake --trace

顺便说一句,您的FLAGS  应该是CFLAGS(参见make -p 的输出)

阅读documentation of make

【讨论】:

  • 我把 if 放在FLAGS 之后,但它没有被调用!为什么CFLAGS 超过FLAGS
【解决方案2】:

我不得不这样修改makefile:

all: $(OBJS)
    $(CC) -g $(OBJS) -o $(OUT)
    make clean

【讨论】:

    【解决方案3】:

    您通常不需要或不想“清理目标文件”。使用 Make 的全部意义在于,您无需清理,而是保持肮脏!

    如果您总是想清理所有内容并从头开始构建每个构建,那么不要费心使用 Make,而是编写一个 shell 脚本。

    【讨论】:

    • 我在精神上同意你的观点,但是阳光下的每个 Makefile 都有一个 clean 目标 — 并且有充分的理由 :)
    • @RadonRosborough 你误解了我的意思——事实上,GNU Make 手册建议有一个clean 目标。所以我们同意所有的 Makefile 可能都有它。我的观点是,人们应该一直使用它,这是一种习惯。 OP 似乎总是想使用它。在这种情况下,最好使用 shell 脚本。有时,对“X 不起作用”的最佳答案是,在您的情况下,最好不要使用 X,这样您的问题就会消失。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-11
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多