我写了一个make文件。
在make文件中我使用了一个变量,比如EXTRAFLAGS,看起来像这样。
EXTRAFLAGS += -D _MSC_VER
EXTRAFLAGS += -D BINARYINPUT
EXTRAFLAGS += -D ENABLEVERSION2D2
此外, 我使用编译器标志
CFLAGS = -Werror -Wall -I $(INC) $(EXTRAFLAGS)
和
mingw32-gcc $(CFLAGS) -o nameofexe OBJ's
我已经使用过这个makefile而没有任何问题。但是当我禁用预处理程序定义时,通过在EXTRAFLAGS中的一个语句之前引入“#”,然后我重新制作它,我的目标是最新的。我无法将预处理器定义引入敏感列表。
我正在使用的临时工作是,介绍一个虚假目标清理并删除所有目标文件并重新编译每件事。但这是浪费时间。我怎样才能更好地管理当前的情况?
答案 0 :(得分:4)
您尚未使.o文件依赖于makefile中的Makefile。
当您在Makefile中对事物进行注释时,您不会更改.o文件所依赖的任何内容 - 与编辑.c文件时不同
您可以通过创建.o或.c文件的依赖项来修复此问题,以包含Makefile本身,当您更新Makefile中的任何内容时,所有源代码都将重新编译。
例如;
SRC=a.c b.c
OBJS=a.o b.o
EXE=ab
$(EXE): $(OBJS)
gcc -o $(EXE) $(OBJS) $(...anything-else...)
$(OBJS): $(SRC) Makefile
(现在有更好的方法来生成.c和.o列表,但上面的内容应该足够用于此示例)
答案 1 :(得分:3)
Make是一个工具,可以在项目中的某个文件发生更改时编译项目。
E.g。当您更改.h文件时,它会识别更改并重建依赖于它的所有文件,然后根据新版本重建所有文件,...
但是当您更改编译器标志和/或makefile中的定义时,项目输入文件不会更改,因此项目不会重建。
有三种方法可以实现您的目标:首先在更改makefile后手动清理make。其次要在makefile中包含makefile本身(并在更改时发出make clean)。最后将定义移动到某个项目特定的.h文件中。
通常只有“in-ah-file-on-own”解决方案是唯一一个避免构建所有新内容的解决方案,因为其他人不知道哪些源文件实际上有对已更改定义的引用