我正在编译一些具有依赖性的项目,所以我不必每次都重新编译,但是当我将-Dsome_flags添加到我的CFLAGS时,它不会重新编译。
dep: $(CPPS)
$(CC) $(CFLAGS) $(INC) -M $(CPPS) > dep
我添加到我的CFLAS -DDEBUG_FLAG,它强迫我做make clean而不是make。
答案 0 :(得分:5)
它不会重新编译,因为您没有将makefile本身列为依赖项。
dep: $(CPPS) Makefile
$(CC) $(CFLAGS) $(INC) -M $(CPPS) > dep
也就是说,如果你从命令行输入make标志(例如CFLAGS=-O3 make all
),make
无法检测到你已经改变了那些并强制完整构建。< / p>
答案 1 :(得分:1)
在我看来,最简单的方法是make clean
然后make
。这当然是假设您希望由于编译器标志的更改而重新编译所有源文件。但你似乎不喜欢这种方法。
如果要修改makefile,可以将makefile的名称添加到每个用于编译源文件的规则中,例如:
somefile.o : somefile.cpp <makefile_name>
$(CC) -c $(CFLAGS) somefile.cpp -o somefile.o
或
%.o : %.c <makefile_name>
$(CC) -c $(CFLAGS) somefile.cpp -o somefile.o
考虑到项目的规模和涉及的规则数量,执行make clean; make
可能是最简单,最快捷的方法。但是,和往常一样,你的里程数各不相同。
价值0.02美元,希望有所帮助 吨。
答案 2 :(得分:1)
Makefile根据它拥有的数据查找更改。您的Makefile声明唯一的依赖项是在 $(CPPS)。
下定义的dep: $(CPPS)
$(CC) $(CFLAGS) $(INC) -M $(CPPS) > dep
因此,make仅跟踪给定列表中的更改,即$(CPPS)。所以决议是:
dep: $(CPPS) Makefile
$(CC) $(CFLAGS) $(INC) -M $(CPPS) > dep
对于完整但非复杂的示例,这是我的helloworld程序的Makefile:
OBJS = helloworld.o
default: hw
%.o: %.c Makefile
gcc -c $< -o $@
hw: $(OBJS)
gcc $(OBJS) -o $@
clean:
-rm -f $(OBJS) hw
每次我更改我的makefile都会重新编译! :)