为什么先决条件的顺序在 makefile 中很重要?

朱莉

我刚刚学习如何创建 makefile 并意识到规则先决条件中头文件和目标文件的顺序很重要,但我不明白为什么。

我研究过很多同学,也聊过很多,猜测很多,但没有人给出答案。

我知道在编译的预处理步骤中,来自头文件和源文件的代码被包含在目标文件中,所以如果我将目标文件和头文件作为先决条件传递,为什么这很重要?

我问是因为如果头文件丢失,我的 Makefile 不应该编译。

这是代码:

CC = gcc
SRC = main.c file1.c
OBJ = $(SRC:.c=.o)
NAME = my_executable
all: header.h $(OBJ)    
     $(CC) $(OBJ) -o $(NAME)
约翰·博林格

我 [...] 意识到规则先决条件中头文件和目标文件的顺序很重要,但我不明白为什么?

典型的实现是make按照它们在 Makefile 中出现的顺序处理每个目标的依赖项。当此类make构建您的示例Makefile的“全部”目标时,它会hello.h在 中列出的任何文件之前检查依赖项$(OBJ)由于没有构建它的规则,make如果该文件不存在则会失败。根据实现和配置,它可能会也可能不会尝试从$(OBJ).

另一方面,如果标头列在其他先决条件之后make,则按顺序处理先决条件的a将尝试构建任何丢失或过时的目标文件,然后再检查标头。

我问是因为如果头文件丢失,我的 Makefile 不应该编译。

看上面。但也确实要明白,你当时依赖的是杂牌。Makefile的缺陷在于它没有正确表达项目的依赖关系。all目标是合成的; 它本身并不真正依赖于任何标题。我想这是部分或全部$(OBJ)文件。因此,您应该改为表达这些依赖项。如果没有这样做,您的情况是,如果构建了项目然后修改了标头,make则不会重建目标文件,尽管它会重新链接它们。

假设所有的目标文件都依赖于头文件,我会像这样修改 Makefile:

CC = gcc
SRC = main.c file1.c
OBJ = $(SRC:.c=.o)
NAME = my_executable
all: $(NAME)

$(NAME): $(OBJ)    
     $(CC) $(OBJ) -o $@

$(OBJ): header.h

最后一行表示在中命名的每个目标都$(OBJ)依赖于header.h. $(NAME)规则说,真正的目标$(NAME)依赖于所有对象。这样,如果header.h更改,则 make 将重建目标文件,但同时,如果没有任何更改,则 make 将不执行任何操作,甚至不会重新链接主可执行文件。如果头文件丢失,则不会尝试构建任何目标文件,因此也不会构建主可执行文件。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Makefile先决条件列表中的分号是什么?

makefile:先决条件$(变量)中的%模式

Makefile 先决条件中的变量分配

在此makefile中,为什么总是要重新构建目标“ bunzip2 / data2.tar”的先决条件?

Makefile,先决条件自动变量中的替代路径

如何在 Makefile 目标中重复相同的先决条件?

为什么“或”条件中的语句顺序很重要?

CMake中是否提供了GNU Makefile中仅订购的先决条件,如果没有,替代选项是什么?

为什么CSS中的注释很重要?

为什么可变借入的顺序在Rust中很重要?

为什么在Rails中强大的参数顺序很重要?

为什么顺序在Observable.merge的用法中很重要?

为什么在MagicMock断言的Kwarg参数中顺序很重要?

为什么cmp指令中的参数顺序很重要?

为什么在着色器中顺序很重要?

为什么方法声明中的顺序很重要?

参数的顺序在getopt中很重要

指定输入源(而不是中间体)作为 Makefile 中目标的先决条件

从URL列表下载文件列表作为makefile中的先决条件

Makefile的同一目标中是否可能有多个先决条件模式?

关于自动生成Makefile先决条件

makefile 不扩展动态先决条件

规则之前的Makefile先决条件

如果PHP中的条件顺序确实很重要

为什么 jBehave 中的复合步骤不先执行先决条件?

什么时候在python中乘法的顺序很重要?

什么是分词?为什么它在Shell编程中很重要?

什么是 express 中的压缩响应,为什么它很重要?

为什么在fmincon中A的行大小很重要