如何在更改生成文件标志时强制重新编译

how to force recompile when changing Makefile flags?

本文关键字:新编译 编译 标志 文件      更新时间:2023-10-16

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

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

我添加到我的 CFLAS -DDEBUG_FLAG 它迫使我做清洁和制作而不是制造。

它不会重新编译,因为您没有将生成文件本身列为依赖项。

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

也就是说,如果你从命令行输入 make 标志(例如 CFLAGS=-O3 make all ),make无法检测到您已经更改了这些内容并强制进行完整构建。

在我看来,最简单的方法是先做一个make clean,然后做一个make。 当然,这是假设您希望由于编译器标志的更改而重新编译所有源文件。 但是你似乎不喜欢这种方法。

如果要修改生成文件,

可以将生成文件的名称添加到用于编译源文件的每个规则中,例如:

    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 美元,希望对您有所帮助T.

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

每次我更改我的制作文件时,它都会重新编译! :)