0

我正在尝试使用 GNU make。假设,我有 3 个 C 文件,其结构如下:

hellomake.c
    |
    |---------------------
    |                    |
    V                    V
hellofunc.c         hellomake.h

生成文件:

hellomake: hellomake.c hellofunc.c
    gcc -o hellomake hellomake.c hellofunc.c -I.

当我第一次输入 make 时,它​​会创建一个程序hellomake。当我第二次运行它时,它会打印:

make: `hellomake' is up to date.

一切正常。

我尝试使用 make 来编译 LaTeX 文件。假设,我有 2 个 TeX 文件:

  1.tex
    |
    V
1_data.tex

1_data 在内部包含在 1.tex 中。

生成文件:

COMMAND = pdflatex

all: 1.tex 1_data.tex
    $(COMMAND) 1.tex

但每次我输入时它都会重新编译 1.tex make。即使没有任何文件被修改。

怎么了?

4

1 回答 1

2

make只看是否all存在。因为它没有,它会尝试创建它(但甚至没有注意到您的命令不会创建文件!)

假设pdflatex真的在某处创建了一个文件,则使用文件名作为目标名称。然后,仅当它比依赖项更旧时才会重新创建它。

概括地说,Makefile 声明了目标文件的映射、它们的依赖关系以及如何从依赖关系中创建它们。当目标缺失或相对于其依赖关系过时时,Make 会运行命令以重新创建它。

(我第一次尝试阐明这个答案时提到.PHONY:了目标作为旁白,但这在这种情况下并没有真正有用;如果您声明.PHONY: all即使all存在名为的文件它也会运行配方,那么这与您正在寻找的行为相反。 )

于 2013-04-27T20:08:15.640 回答