MAKE的使用

来源:互联网 发布:淘宝店铺不能添加桌面 编辑:程序博客网 时间:2024/06/07 06:54

一、什么是Make

Make理解为一种脚本,这种脚本主要用于多文件编译。

Make命令的执行原理是利用Makefile中的文件依赖关系以及源文件的最后修改时间来确定哪些文件需要重新编译。

一个完整的makefile有5部分组成

1)显示规则

主动编写描述规则,用于指示在何种状态下更新哪些目标文件;即:在编写makefile时需要明确指出各目标文件所依赖的源文件集合,以及编译本目标文件所需要的命令;

2)隐含规则

指用make中默认的方式,可以根据目标文件的类型自动推导出的规则。

3)变量定义

可以使用变量

4)makefile指示符

用于告诉make工具,当程序在读取makefile文件时要执行的动作;

5)注释

#

二、makefile规则

1、makefile的基本规则

1)

myapp:hello.c
gcc hello.c -o myapp
clean:
rm myapp

2)、规则原型:

target...:prerequisites...

command

...

...

target:目标文件

prerequisites:依赖文件

command:响应命令,即由依赖文件生成目标文件所需要的命令

注意:

(1)规则中的命令必须以tab键开头,即command之前有tab。make工具会将所有已tab键开头的行当成命令交给shell执行。

(2)为方便阅读,将一个长的命令行写到多行上,用\进行连接。


3)、通配符的使用

"*"、”?“、”[...]“也可以在makefile中使用


2、伪目标

伪目标并不代表一个真正的文件名,在执行make时,可以通过指定一个伪目标来执行其所在的规则中定义的命令。

clean:

rm *.o myapp

通过输入make clean调用命令rm  *.o myapp来删除旧的文件。

1).PHONY的应用:显示指定clean为伪目标,而不将其视为文件,输入make clean后,其对应的命令总被执行。

.PHONY:clean

2)出错处理


使用make编译源程序时,如果其中的一条语句执行出错,程序会报错,并且会中途退出。

针对此问题,可以使用”-f“(--force)选项来防止因缺少待删除的文件而导致程序中途退出,他的工作原理是Make会提示错误信息,但不会中途退出。

Make还提供了一个内置的宏定义RM,其定义为 RM = rm -f。

3、规则中的shell命令

1)命令回显


echo前面加上@


2)shell命令执行方式

在规则命令中,如果存在多行命令,则每一行命令将在一个独立的子shell进程中执行。因此,多行命令运行时,命令之间是相互独立的,相互之间不存在任何的依赖关系。


三、Makefile变量

1、变量定义

1)递归展开式变量


虽然var2中对变量var1的引用是在第一次赋值之后,但输出的值却是在引用之前最后一次有效赋值的结果。

可知变量值确实不是在定义的时候确定的,而是在展开的时候确定的。


2)直接展开式变量

使用”:=“定义的。


2、变量的引用

$(var1)


四、Make的执行

make -k或make -keep-going

当出现错误时继续执行,直到出现致命错误再停止。


五、示例

1、程序源代码

1)fun1.h

#ifndef _FUNC1_H
#define _FUNC1_H
void fun1print();
#endif

2)fun1.c

#include <stdio.h>
#include "fun1.h"

void fun1print()
{
printf("this is func1 print\n");
}

3)fun2.h

#ifndef _FUN2_H_
#define _FUN2_H_
void fun2print();
#endif

4)fun2.c

#include <stdio.h>
#include "fun2.h"
#include "fun1.h"
void fun2print()
{
printf("in func2,first call fun1\n");
fun1print();
printf("this is fun2 print\n");
}

5)main.c

#include <stdio.h>
#include "fun1.h"
#include "fun2.h"

main()
{
fun1print();
fun2print();
}

2、Make的编写流程

1)编写可执行文件生成规则。

myapp:fun1.o fun2.o main.o
gcc fun1.o fun2.o main.o -o myapp

2) 编写个目标文件生成规则。

fun1.o:fun1.c fun1.h
gcc -c fun1.c 

fun2.o:fun2.c fun2.h fun1.h
gcc -c fun2.c

main.o:main.c fun1.h fun2.h
gcc -c main.c

3)编写伪目标规则

clean:
rm -rf *.o myapp


0 0
原创粉丝点击