没有合适的资源?快使用搜索试试~ 我知道了~
Makefile规则、Makefile规则、Makefile的条件执行、Makefile函数、Makefile库的生成和使用
需积分: 0 2 下载量 113 浏览量
2024-01-10
10:35:24
上传
评论
收藏 28KB DOCX 举报
温馨提示
试读
12页
Makefile的基本语法包括五个部分:Makefile规则、Makefile规则、Makefile的条件执行、Makefile函数、Makefile库的生成和使用。这篇文档详细讲解了这五块内容。 Makefile是一种用于自动化编译程序的工具,它包含一系列规则来指示系统如何构建应用程序。在Makefile中,每个规则由一个目标文件、一个或多个依赖文件以及一组命令行指令组成。make 程序根据 Makefile 中的规则描述执行相关的命令来完成指定的任务。 在一个完整的 Makefile 中,包含了 5 个东西:显式规则、隐含规则、变量定义、 指示符和注释。
资源推荐
资源详情
资源评论
二,Makefile 的基本语法
Makefile 是一种用于自动化编译程序的工具,它包含一系列规则来指示系统如何构建应用程
序。在 Makefile 中,每个规则由一个目标文件、一个或多个依赖文件以及一组命令行指令组
成。make 程序根据 Makefile 中的规则描述执行相关的命令来完成指定的任务。
在一个完整的 Makefile 中,包含了 5 个东西:显式规则、隐含规则、变量定义、 指示符
和注释。
1.Makefile 规则
熟悉规则对于书写 Makefile 至关重要,我们书写的 Makefile 的第一个规则应该就是重建
整个程序或者多个程序的依赖关系和执行命令的描述。
1.1 规则语法
一个简单的 Makefile 描述规则组成:
TARGET: PREREQUISITES
COMMAND
TARGET:规则的目标。通常是最后需要生成的文件名或者为了实现这个目的而必需 的中间
过程文件名。可以是.o 文件、也可以是最后的可执行程序的文件名等。另外,目 标也可以
是一个 make 执行的动作的名称,如目标“clean”,我们称这样的目标是“伪 目标”。
PREREQUISITES:规则的依赖。生成规则目标所需要的文件名列表。通常一个目标依 赖于一
个或者多个文件。
COMMAND:规则的命令行。是规则所要执行的动作(任意的 shell 命令或者是可在 shell
下执行的程序)。它限定了 make 执行这条规则时所需要的动作。一个规则可以有多个命
令行,每一条命令占一行。
注意:每一个命令行必须以[Tab] 字符开始,[Tab]字符告诉 make 此行是一个命令行。make
按照命令完成相应的动作。
规则的中心思想是:目标文件的内容是由依赖文件文件决定,依赖文件的任何一处改动,将
导致目前已经存在的目标文件的内容过期。规则的命令为重建目标提供了方法。 这些命令
运行在系统 shell 之上。
举例说明:
现有一个加法运算的计算器:
add.c
#include<stdio.h>
void add_init()
{
printf("add operation init");
}
add.h
#ifndef _ADD_H
#define _ADD_H
void add_init();
#endif
operation.c
#include<stdio.h>
#include "add.h"
int main()
{
printf("operation beginning\n");
add_init();
return 0;
}
则其 Makefile 如何编写呢?
.PHONY:clean
all :test
test:add.o operation.o
gcc -o test add.o operation.o
operation.o :operation.c
gcc -o operation.o -c operation.c
add.o : add.c
gcc -o add.o -c add.c
clean:
rm -rf add.o test operation.o
此代码依赖关系解析
1.2 Makefile 特殊目标
在 Makefile 中,有一些名字,当它们作为规则的目标时,具有特殊含义。它们时一些特殊的
目标,GUN make 所支持的特殊的目标有很多,常用的特殊目标有:
.PHONY:
目标“.PHONY”的所有的依赖被作为伪目标。伪目标是这样一个目标:当使用 make 命令行指
定此目标时,这个目标所在规则定义的命令、无论目标文件是否存在都会被无条件执行。
1.3 Makefile 伪目标
Makefile 中一个重要的特殊目标:伪目标,它不代表一个真正的文件名,在执行 make 时可
以指定这个目标来执行其所在规则定义的命令,有时也可以将一个伪目标称为标签。以下就
对其简单使用进行分析解说:
如果我们需要书写一个规则,规则所定义的命令不是去创建目标文件,而是通过 make
命令行明确指定它来执行一些特定的命令,比如常见的 clean 目标。
clean:
rm *.o
此命令就是删除当前目录下的所有.o 文件,当工作目录下不存在“clean”这个文件时,我们输
入“make clean”,就会执行删除命令,实现了这条规则的设想结果。但是如果在当前工作目
录下存在文件“clean”,同样我们输入 “make clean”,由于这个规则没有任何依赖文件,所以
目标被认为是最新的而不去执行规则所定义的命令,因此命令“rm”将不会被执行。无法达到
设想的结果。所以我们需要将目标“clean”声明为伪目标。将一个目标声明为伪目标的方法是
将它作为特殊目标.PHONY”的依赖。如:
.PHONY : clean
这样目标“clean"就被声明为一个伪目标,无论在当前目录下是否存在“clean”这个 文件。我
们输入“make clean”后。“rm”命令都会被执行。而且,当一个目标被声 明为伪目标后,make
在执行此规则时不会去试图去查找隐含规则来创建它。这样也提高了 make 的执行效率,同
时也不用担心由于目标和文件名重名。因此目标“clean”的完整书写格式应该如下:
.PHONY : clean
clean
rm *.o
1.4 多目标
一个规则中可以有多个目标,规则所定义的命令对所有的目标有效。一个具有多目标的规则
相当于多个规则。多目标规则意味着所有的目标具有相同的依赖文件。举例说明
可在上述 Makefile 中增加如下,以下为一个多目标
all:test2 test3
test2 test3:
@echo "hello world"
相当于
all test2 test3
test2:
@echo "hello world"
test3:
@echo "hello world"
发现 make 后打印了两次 hello world。
1.5 多规则目标
Makefile 中,一个文件可以作为多个规则的目标(多个规则中只能有一个规则定义 命令
)。这种情况时,以这个文件为目标的规则的所有依赖文件将会被合并成此目标一个依赖文
件列表,当其中任何一个依赖文件比目标更新(比较目标文件和依赖文件的时 间戳)时,
make 将会执行特定的命令来重建这个目标。
如果多个规则同时给出重建此目标的命令,make 将使用最后一个规则中所定义的命令,
同时提示错误信息。
举例说明:
可在上述 Makefile 中增加如下,以下为一个多规则目标
all :test4
test4:
@echo "hello world"
test4:
@echo "welcome to China"
可见出现了警告,并且只显示了最后一条规则定义的命令。可用双冒号规则解决。
1.6 文件时间戳
剩余11页未读,继续阅读
资源评论
david_liufei
- 粉丝: 27
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功