基本的 Makefile

考虑写一个 Hello World! 程序在 c。让我们说我们的源代码在一个名为 source.c 的文件中,现在为了运行我们需要编译它的程序,通常在 Linux 上(使用 gcc)我们需要输入 $> gcc source.c -o output,其中 output 是可执行文件的名称产生。对于基本程序,这很有效,但随着程序变得越来越复杂,我们的编译命令也会变得更加复杂。这是 Makefile 的用武之地,makefile 允许我们为编译程序编写一组相当复杂的规则,然后通过在命令行输入 make 来编译它。例如,这里是上面的 hello wold 示例的可能示例 Makefile。

基本的 Makefile

让我们创建一个基本的 Makefile ,并将它保存到我们的系统中,与我们的源代码 Makefile 相同。请注意,此文件需要命名为 Makefile,但是 capitol M 是可选的。这说使用国会大厦 M 是相对标准的。

output: source.c
    gcc source.c -o output

请注意,在第二行的 gcc 命令之前只有一个选项卡(这在 makefile 中很重要)。一旦每次用户输入 make(与 Makefile 在同一目录中)时都会写入这个 Makefile,make 将检查 source.c 是否已被修改(检查时间戳),如果它已被修改,而不是输出它将运行以下行的编译规则。

Makefile 中的变量

根据项目的不同,你可能需要在 make 文件中引入一些变量。这是一个包含变量的 Makefile 示例。

CFLAGS = -g -Wall

output: source.c
    gcc $< $(CFLAGS) -o $@

现在让我们来探讨这里发生的事在第一行中,我们声明了一个名为 CFLAGS 的变量,该变量包含你可能希望传递给编译器的几个常见标志,请注意你可以在此变量中存储任意数量的标志。然后我们使用与之前相同的行来告诉 make 检查 source.c 以查看它是否比输出更新,如果是,它运行编译规则。我们的编译规则与以前大致相同,但是通过使用变量缩短了它,$< 变量内置于 make 中(称为自动变量,请参阅 https://www.gnu.org/software/make/manual/html_node /Automatic-Variables.html )它总是代表源,所以在这种情况下 source.c$(CFLAGS) 是我们之前定义的变量,但请注意,我们必须将变量放在括号中,并且前面有一个$,如 this$(someVariable)。这是告诉 Make 将变量扩展为你之前键入的语法的语法。最后我们有$ @符号,这又是一个内置于 make 的变量,它只是代表编译步骤的目标,所以在这种情况下它代表输出

清洁

Make clean 是了解 make 文件的另一个有用概念。让我们从上面修改 Makefile

CFLAGS = -g -Wall
TARGETS = output

output: source.c
    gcc $< $(CFLAGS) -o $@

clean:
    rm $(TARGETS)

正如你所看到的,我们只是在 Makefile 中添加了一个规则,以及一个包含所有目标的附加变量。这是一个在 makefile 中有一些常见的规则,因为它允许你通过输入 $> make clean 快速删除你生成的所有二进制文件。通过键入 make clean,你可以告诉 make 程序运行 clean 规则,然后 make 将运行 rm 命令来删除所有目标。

我希望这个使用 make 的简要概述可以帮助你加快工作流程, Makefile 可能会变得非常复杂,但是有了这些想法,你应该能够开始使用 make 并更好地了解其他程序员 Makefiles 正在发生的事情。有关使用 make 一个优秀资源的更多信息,请访问 https://www.gnu.org/software/make/manual/