Makefile的Hello World

Makefile的规则

Makefile的语法或者说规则很简单。它的规则如下:

targets: prerequisites
<commands>

target 也就是一个目标文件,可以是 Object File,也可以是执行文件。还可以是一个标签( Label),对于标签这种特性,在后续的“ 伪目标” 章节中会有叙述。

prerequisites 就是,要生成那个target 所需要的文件或是目标。

command 也就是 make 需要执行的命令。(任意的 Shell 命令)

要执行规则,只需从Makefile所在的同一目录在终端中运行make命令。在不指定目标的情况下运行make,将执行Makefile中定义的第一个规则。按照约定,Makefile中的第一条规则通常称为all或default,通常列出要作为依赖文件的所有有效的目标。

prerequisites 中如果有一个以上的文件比 target文件要新的话, command所定义的命令就会被执行。这就是 Makefile 的规则。也就是Makefile中最核心的内容。

Makefile的Hello World

和学习其他编程语言一样,我们在学习Makefile的时候,照着学习编程语言的思路来学。下面用一个Hello World的示例来介绍Makefile。

1. Prerequisites(依赖文件)

我们最初始的依赖文件就是源文件,新建一个main.c,编写一个打印Hello world的程序。

#include <stdio.h>

int main(void)
{
   printf("Hello world!\n");
   return 0;
}

2. Makefine文件创建

新建一个文本文件,命名为"Makefile"放在main.c文件同一个目录下。注意,这个文本文件是不带后缀".txt",输入以下命令:

main:main.o
    gcc -o main main.o

main.o:main.c
    gcc -c main.c 

注意:这里的gcc前面的缩进必须是一个tab缩进,不能手敲空格,这是makefile的语法要求

Makefile的文件名不一定必须是Makefile。

事实上,执行make命令时,是按照GNUmakefile、makefile、Makefile的顺序找到第一个存在的文件并执行它。

建议使用Makefile做文件名。除了GNU make,有些UNIX系统的make命令不是GNU make,不会查找GNUmakefile这个文件名,如果你写的Makefile包含GNU make的特殊语法,可以起名GNUmakefile,否则不建议用这个文件名。

3. 运行make程序**

在前面一个章节中,我们已经安装了Cygwin,并且已经设置了环境变量,因此我们可以直接在当前文件夹目录下进入命令行环境,运行make程序。(如果还未安装Cygwin,请参考我上一篇文章《Cygwin安装教程【超详细】》)

操作步骤:
1. 在当前文件夹下进入命令行环境;
2. 输入命令"make"执行编译链接命令
例如我当前main.c和Makefile文件存放的目录是:F:\C\Makefile\Hello。make执行结果如下:
makefile-hello

4. 验证测试生成的可执行文件

make命令运行结束后,我们可以到源文件所在的目录查看生成的执行文件。可以看到目录下会生成两个文件,分别是main.o和main.exe。在命令行环境下直接输入"main.exe"运行可执行程序。
makefile-hello1

我们可以看到,命令行窗口中打印出了"Hello world!",这说明程序执行成功。我们的Makefile在make程序的处理下完成了编译链接生成可执行文件的整个过程。

下一节