MAKE的使用
2015-12-28 14:04
281 查看
一、什么是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
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
相关文章推荐
- Yocto开发笔记之《Tip-应用程序无法在目标机运行》(QQ交流群:519230208)
- utf8编码原理与发展历程
- SQL Server审计功能入门:SQL Server审核 (SQL Server Audit)
- getWritableDatabase()和getReadableDatabase()的区别
- php 常用功能
- 今天开始进驻CSDN博客,记录自己unity3d学习的每一步。
- LDA主题模型学习笔记3.5:变分參数推导
- 《转》用C#通过反射实现动态调用WebService 告别Web引用
- UVA-514 Rails (栈)
- CTE 2.0 已发布
- CTE 2.0 更新内容预览(重写所有功能,并且开放源码)(即将发布)
- Unity水效果
- 自定义颜色控件の颜色采集View
- Win7 Touch API说明
- CTE(Custom Terrain Editor)使用说明
- CTE(CustomTerrainEditor) 自定义地形编辑器(已上传视频, 并更新版本到CTE1.3)
- Unity3D 自定义地形插件(支持FBX导入模型的编辑)
- selenium+python 遍历select下拉框获取value值
- iOS开发必收藏】详解iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程!【2012-6-25日更新iap恢复详解】
- 智能家居网络系统设计(二)