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

how to force recompile when changing Makefile flags?

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

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

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

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

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

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

在我看来,最简单的方法是执行 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 美元,希望对您有所帮助 T.

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