以下是我以前的考试题目,我失去了很多分数,我仍然不确定原因。
假设我有一个包含以下文件的目录:
fileB.txt makefile scriptC programA.h programA.c
makefile ,其内容如下:
fileE.txt: fileD.txt programA
programA fileD.txt >| fileE.txt
programA.o: programA.h programA.c
gcc -c -Wall programA.c
programA: programA.o
gcc -o programA programA.o
fileD.txt: fileB.txt scriptC
scriptC fileB.txt >| fileD.txt
CC=gcc
CFLAGS=-Wall
a)第一次在命令提示符下键入make时,make工具会显示和执行哪些命令?
b)现在让我们说你更新或触摸,fileB.txt,make工具会显示哪些命令?
我无法复制程序自己尝试,因为我实际上并不知道程序在做什么。我可以预测简单的make文件的输出,但我从来没有见过像下面的那个,即使用管道和txt文件。关于这个问题的简单解释将非常有用。
答案 0 :(得分:1)
fileE.txt: fileD.txt programA
programA fileD.txt >| fileE.txt
programA.o: programA.h programA.c
gcc -c -Wall programA.c
programA: programA.o
gcc -o programA programA.o
fileD.txt: fileB.txt scriptC
scriptC fileB.txt >| fileD.txt
CC=gcc
CFLAGS=-Wall
让我们试试这个现场/盲人。
fileE.txt
,因此make
默认会尝试构建fileE.txt
取决于fileD.txt
和programA
fileD.txt
是否存在(它没有)所以它会尝试创建它fileD.txt
取决于fileB.txt
和scriptC
fileD.txt
的规则
scriptC fileB.txt >| fileD.txt
scriptC
的作用并不重要,因为fileD.txt
是由shell重定向创建的fileD.txt
现在是最新的,并转到programA
programA
不存在,所以make尝试构建它programA
取决于programA.o
哪些不存在,所以make尝试构建它programA.o
取决于programA.h
和programA.c
programA.o
的规则
gcc -c -Wall programA.c
programA.o
programA.o
现在是最新的,所以请继续programA
的所有先决条件,因此make会为其运行规则
gcc -o programA programA.o
fileE.txt
的所有先决条件现在都是最新的,因此make会为其运行规则
programA fileD.txt >| fileE.txt
总结上述步骤的输出:
scriptC fileB.txt >| fileD.txt
gcc -c -Wall programA.c
gcc -o programA programA.o
programA fileD.txt >| fileE.txt
现在,如果您touch fileB.txt
此时再次运行`make make:
fileE.txt
,因此make
默认会尝试构建fileE.txt
取决于fileD.txt
和programA
fileD.txt
是否存在(确实存在)并将检查其先决条件fileB.txt
比fileD.txt
更新,因此make会将fileD.txt
标记为需要重建scriptC
早于fileD.txt
,但不会改变任何内容fileD.txt
的先决条件现已完成,需要重建fileD.txt
scriptC fileB.txt >| fileD.txt
fileD.txt
现在是最新的,所以请继续programA
早于fileE.txt
(并且本身是最新的)所以请继续行动fileE.txt
的所有先决条件现在都是最新的,有些已经构建并且现在更新了,因此make将运行规则来构建fileE.txt
programA fileD.txt >| fileE.txt
总结上述步骤的输出:
scriptC fileB.txt >| fileD.txt
programA fileD.txt >| fileE.txt
答案 1 :(得分:1)
使用以下推理/规则:
因此假设没有给出目标,则使用规则4并且fileE.txt
是“活跃的”#39;目标
fileE.txt
要求fileD.txt
和programA
可用(规则1)。两者都不可用,因此需要构建它们(规则2)。
fileD.txt
要求fileB.txt
和scriptC
可用(规则1)。没有定义这些依赖项的目标,因此它们不会重建。并且fileD.txt
可以构建(规则2)。
programA
要求programA.o
可用(规则1)。提供了一个目标,因此可以构建programA.o
(规则2)。接下来,可以构建programA
(规则2)。
现在满足fileE.txt
的所有要求,因此也可以构建它。
触及fileB.txt
时也是如此,但您也需要应用规则3.
使用这个(部分)示例和信息,您应该能够确定执行哪些命令(以及在哪个命令上)。
答案 2 :(得分:1)
a)第一次在命令提示符下键入make时,make工具会显示和执行哪些命令?
makefile
中的第一个目标。这是fileE.txt
fileE.txt
取决于fileD.txt and programA
,因此这些将成为您的目标。以下是执行命令的顺序。内联评论
- scriptC fileB.txt> | fileD.txt / *输出是fileD.txt * /
- gcc -c -Wall programA.c / 输出是programA所需的programA.o /
- gcc -o programA programA.o / 输出是fileE.txt所需的programA /
- programA fileD.txt> | fileE.txt / 最终输出文件fileE.txt /
醇>
b)现在让我们说你更新或触摸fileB.txt,make工具会显示哪些命令? 执行以下命令。
- scriptC fileB.txt> | fileD.txt / *输出是fileD.txt * /
- programA fileD.txt> | fileE.txt / 最终输出文件fileE.txt /
醇>
在这种情况下,programA
不会重建,因为它已经可用。