我有以下make文件: -
VER = Debug
CC = gcc
objectfiles = Getstr.o ui.o ustreqsol.o main.o
pkg = `pkg-config --cflags --libs gtk+-3.0`
obj = $(addprefix objs/,$(objectfiles))
../$(VER)/Calculator: $(obj)
$(CC) -o $@ $(obj) $(pkg)
./objs/ui.o:ui.c
$(CC) -c -o $@ $< $(pkg)
./objs/main.o:main.c
$(CC) -c -o $@ $< $(pkg)
./objs/%.o: %.c %.h
$(CC) -c -o $@ $<
clean:
-rm ../$(VER)/Calculator
-rm /objs/*
以及我的src目录中的文件: -
$ ls
Getstr.c main.c Makefile objs ui.c ui.h ustreqsol.c ustreqsol.h
objs是目录。当我更改ustreqsol.h文件时,它会编译ustreqsol.c文件,但不能用于ui.h文件
$ touch ustreqsol.h
$ make
gcc -c -o objs/ustreqsol.o ustreqsol.c
gcc -o ../Debug/Calculator objs/Getstr.o objs/ui.o objs/ustreqsol.o objs/main.o `pkg-config --cflags --libs gtk+-3.0`
$ make
make: '../Debug/Calculator' is up to date.
$ touch ui.h
$ make
make: '../Debug/Calculator' is up to date.
作为makefile中的菜鸟,我不知道为什么会发生这种情况
答案 0 :(得分:1)
ui.c没有被重建的原因是因为你明确地说ui.h不是依赖:
./objs/ui.o:ui.c
$(CC) -c -o $@ $< $(pkg)
对于您设置的一般依赖项:
./objs/%.o: %.c %.h
$(CC) -c -o $@ $<
依赖关系列表仅对您未明确设置它们的文件生效,例如ustreqsol.c。
您需要为每个目标文件添加目标,指定每个目标文件的依赖项。目标可以为空白,因为%.o
目标将填写要执行的操作。
例如:
./objs/ustreqsol.o: ustreqsol.c ustreqsol.h ui.h
./objs/ui.o: ui.c ui.h
./objs/main.o: main.c ui.h ustreqsol.h
./objs/Getstr.o: Getstr.c
./objs/%.o: %.c %.h
$(CC) -c -o $@ $<