更改文件后,“生成”无效

时间:2016-03-23 07:13:35

标签: makefile

这些是我的档案: add.c add.h main.c makefile

这是makefile:

main:main.o add.o
    gcc -o main main.o add.o
main.o:$(@:%.o=%.c)
    gcc -o main.o -c main.c
add.o:$(@:%.o=%.c) $(@:%.o=%.h)
    gcc -o add.o -c add.c
.PHONY:clean 
clean:
    rm *.o -rf
    rm main -rf

然后在我更改main.c并make之后。 但是告诉我这个: make:`main'是最新的。

如果我改变了我的makefile:

main:main.o add.o
    gcc -o main main.o add.o
main.o:main.c
    gcc -o main.o -c main.c
add.o:$(@:%.o=%.c) $(@:%.o=%.h)
    gcc -o add.o -c add.c
.PHONY:clean 
clean:
    rm *.o -rf
    rm main -rf

然后在我更改main.c并make之后。 它可以工作。

我不知道原因。

1 个答案:

答案 0 :(得分:1)

中的依赖项
main.o:$(@:%.o=%.c)
add.o:$(@:%.o=%.c) $(@:%.o=%.h)

无效make语法。

用一种模式(通用)规则替换这两条规则:

%.o : %.c
    gcc -c -o $@ ${CPPFLAGS} ${CFLAGS} $<

上述规则实际上非常类似built-in rule来编译来自.o的{​​{1}}文件:

  

编译C程序

     

.c是使用n.o形式的食谱从n.c自动生成的。

换句话说,您可以删除$(CC) $(CPPFLAGS) $(CFLAGS) -cmain.o的原始规则,并且应该正确构建。