如何在更改Makefile标志时强制重新编译?

时间:2015-04-26 12:16:30

标签: c++ c gcc g++

我正在编译一些具有依赖性的项目,所以我不必每次都重新编译,但是当我将-Dsome_flags添加到我的CFLAGS时,它不会重新编译。

dep: $(CPPS)
    $(CC) $(CFLAGS) $(INC) -M $(CPPS) > dep

我添加到我的CFLAS -DDEBUG_FLAG,它强迫我做make clean而不是make。

3 个答案:

答案 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都会重新编译! :)