使预处理器定义具有文件敏感性

时间:2011-11-28 06:11:36

标签: c makefile gnu-make

我写了一个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中的一个语句之前引入“#”,然后我重新制作它,我的目标是最新的。我无法将预处理器定义引入敏感列表。

我正在使用的临时工作是,介绍一个虚假目标清理并删除所有目标文件并重新编译每件事。但这是浪费时间。我怎样才能更好地管理当前的情况?

2 个答案:

答案 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”解决方案是唯一一个避免构建所有新内容的解决方案,因为其他人不知道哪些源文件实际上有对已更改定义的引用