【问题标题】:Make File sensitivity on Preprocessor Definitions使预处理器定义的文件敏感
【发布时间】:2011-11-28 06:11:36
【问题描述】:

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

我目前正在使用的临时解决方法是,引入虚假目标清理并删除所有目标文件并重新编译所有内容。但这是浪费时间。如何更好地管理当前场景?

【问题讨论】:

  • 你的意思是如果你改变EXTRAFLAGS文件不会重新构建?
  • 是的,当我更改额外标志时,它们不会重新构建

标签: c makefile gnu-make


【解决方案1】:

您没有使您的 .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 列表,但是以上对于这个例子应该足够了)

【讨论】:

  • 是的。这正是我应该做的。在敏感度列表中引入 makefile 以及 obj 文件。感谢您的帮助。
【解决方案2】:

Make 是一个工具,当您的项目中的一个文件发生更改时,它会重新编译您的项目。

例如当您更改 .h 文件时,它会识别更改并重建所有依赖它的文件,然后重建所有依赖于新版本的文件,...

但是当您更改编译器标志和/或 makefile 中的定义时,项目输入文件不会更改,因此项目不会重新构建。

有三种方法可以实现您想要的: 首先在更改 makefile 后手动发出 make clean。其次,将makefile本身包含在您的makefile中(并在它更改时发出make clean)。最后将定义移动到某个项目特定的 .h 文件中。

通常只有“in-a-h-file-on-its-own”解决方案是唯一的一种,它避免构建所有新内容,因为其他人不知道哪些源文件实际上引用了更改后的定义.

【讨论】:

  • 第一种方法是我目前正在做的事情。第三个是我不想做的,因为我根本不希望用户接触源。让源作者担心吧。我已将我的 makefile 的名称与我的目标文件一起添加到敏感度列表中。这解决了这个问题。你说的第二种方式是我做的还是有什么不同?
  • @ram: 是的,这正是第二种方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 2017-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多