这些是我的档案: 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之后。 它可以工作。
我不知道原因。
答案 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) -c
和main.o
的原始规则,并且应该正确构建。