Skip to content

Makefile基本规则

规则介绍

Makefile由一组规则组成,规则如下:

makefile
目标: 依赖
(tab)命令

Makefile基本规则三要素:

  • 目标:要生成的目标文件,通常是要产生的文件名称,目标可以是可执行文件或其它obj文件,也可是一个动作的名称
  • 依赖:目标文件由哪些文件生成,一个目标通常有几个依赖文件(可以没有)
  • 命令:通过执行该命令由依赖文件生成目标,make执行的动作,一个规则可以含几个命令(可以没有),有多个命令时,每个命令占一行

make命令格式

make是一个命令工具,它解释Makefile 中的指令(应该说是规则)。

make命令格式:

shell
make [ -f file ][ options ][ targets ]

[ -f file ]

  • make默认在工作目录中寻找名为GNUmakefile、makefile、Makefile的文件作为makefile输入文件
  • -f 可以指定以上名字以外的文件作为makefile输入文件

[ options ]

  • -v: 显示make工具的版本信息
  • -w: 在处理makefile之前和之后显示工作路径
  • -C dir:读取makefile之前改变工作路径至dir目录
  • -n:只打印要执行的命令但不执行
  • -s:执行但不显示执行的命令

[ targets ]

  • 若使用make命令时没有指定目标,则make工具默认会实现makefile文件内的第一个目标,然后退出
  • 指定了make工具要实现的目标,目标可以是一个或多个(多个目标间用空格隔开)

示例

实例

下面以具体的例子来讲解:

当前目录下有main.c add.h add.c,根据这个基本规则编写一个简单的Makefile文件,生成可执行文件main

第一个版本的Makefile:

makefile
# 默认目标  
all: main  

# main依赖于main.c和add.c 
main: main.c add.c
	gcc main.c add.c -I ./ -o main
c
#include "add.h"
#include <stdio.h>

int main(void) {
    printf("%d\n", add(10, 20));

    return 0;
}
c
#ifndef __SYSS_ADD_H__
#define __SYSS_ADD_H__

int add(int a, int b);

#endif //__SYSS_ADD_H__
c
#include "add.h"

int add(int a, int b) {
    return a + b;
}

执行make

缺点:效率低,修改一个文件,所有的文件会全部重新编译。