为什么我的 Makefile 在没有更改的情况下不断重新编译?

为什么我的 Makefile 在没有更改的情况下不断重新编译?

我有一个看起来像这样的 makefile

all:    all_functions
all_functions:  a_functions.o b_functions.o c_functions.o d_functions.o main.o a.h b.h c.h d.h main.h 
      gcc -o program1 a_functions.o b_functions.o c_functions.o d_functions.o main.o
a_functions.o:  a_functions.c a.h
      gcc -c -o a_functions.o a_functions.c
b_functions.o:  b_functions.c b.h
      gcc -c -o b_functions.o b_functions.c
c_functions.o:  c_functions.c c.h
      gcc -c -o c_functions.o c_functions.c
d_functions.o:  d_functions.c d.h
      gcc -c -o d_functions.o d_functions.c
main.o: main.c main.h
      gcc -c -o main.o main.c
clean:
      rm *.o program1
install:
      cp ./program1 "/usr/local/program1"
uninstall:
      rm "/usr/local/program1"

我在 makefile 中使用了制表符而不是空格。当我这样做时make -f Makefile,makefile 每次都会编译并创建program1,即使文件存在并且没有进行任何更改。我的 makefile 有什么问题?我希望看到一条错误消息“make:Nothing to be do for..”

答案1

你正在使用虚假目标,IE具有有用名称但其配方不会产生目标的目标。也就是说,make最终尝试构建all_functions目标,但关联的配方不会构建任何名为 的内容all_functions

如果将前两行替换为

all: program1
program1: a_functions.o b_functions.o c_functions.o d_functions.o main.o a.h b.h c.h d.h main.h

您应该会发现它的make行为符合您的预期。

相关内容