makefile简略教程
Posted 清水寺扫地僧
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了makefile简略教程相关的知识,希望对你有一定的参考价值。
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
make命令执行时,需要一个 Makefile 文件,以告诉make命令需要怎么样的去编译和链接程序。
工程有若干个C文件和头文件,需要写一个Makefile来告诉make命令如何编译和链接这几个文件。规则是:
1)如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。
2)如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。
3)如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。
以下是 makefile / Makefile (只能这两种写法) 的简要用法:
1个规则
目标 : 依赖条件 target ... : prerequisites ...
(一个tab缩进)命令 command
1. 目标的时间必须晚于依赖条件的时间,否则就更新目标;
2. 依赖条件如果不存在,找寻新的规则去产生依赖条件;
2个函数
src = $(wildcard ./*.c) 匹配当前工作目录下的所有.c文件。将文件名组成列表,赋值给变量 src.
# src = add.c sub.c div1.c
obj = $(patsubst %.c, $.o, $(src)) 将参数3中,包含参数1的部分,替换为参数2.
# obj = add.o sub.o div1.o
clean : 没有依赖,作为标签label
-rm -rf $(obj) a.out
"-"左右时删除不存在的文件时,不报错,且顺序执行结束,也即是也许某些文件出现问题,但不要管,继续做后面的事。
3个自动变量
$@
:在规则的命令中,表示规则中的目标;
$^
:在规则的命令中,表示所有依赖条件;
$<
:在规则的命令中,表示第一个依赖条件。如果将该变量应用在模式规则中,它可将依赖条件列表中的依赖一次取出,套用模式规则。
模式规则:
%.o:%.c
gcc -c $< -o %@
静态模式规则:
<targets ...>: <target-pattern>: <prereq-patterns ...>
<commands>
...
targets定义了一系列的目标文件,可以有通配符。是目标的一个集合。
target-parrtern是指明了targets的模式,也就是的目标集模式。
prereq-parrterns是目标的依赖模式,它对target-parrtern形成的模式再进行一次依赖目标的定义。
e.g.:
$(obj):%.o:%.c
gcc -c $< -o %@
伪目标:
.PHONY: clean ALL
以下内容作为拓展,今后再看,转自陈皓的博客,专栏见:编程语言
以下是整理的他的系列博客,可供参考,特别是以例子进行讲解很形象:
- 跟我一起写 Makefile(一):Makefile的简单介绍,引出讲解的例子;
- 跟我一起写 Makefile(二):自定义变量,make自动推导机制,clean标签的写法,文末提到了.PHONY伪目标;
- 跟我一起写 Makefile(三):Makefile概述,分为Makefile中的五种内容,引用其他的Makefile/include,环境变量 MAKEFILES,make的工作方式;
- 跟我一起写 Makefile(四):Makefile语法规则,通配符的使用(和shell类似),文件搜寻(vpath关键字),伪目标(.PHONY:)
- 跟我一起写 Makefile(五):多目标,静态模式(辅助定义多目标规则),自动生成依赖性;
- 跟我一起写 Makefile(六):命令书写(显示命令,执行命令,命令出错),嵌套执行make(进行模块编译和分段编译,
export
,unexport
),定义命令包(脚本指令复用,define
…endef
命令体); - 跟我一起写 Makefile(七):变量(类似于C/C++当中的宏,在运行时会展开)(变量命名规则,变量的嵌套定义(变量是可以使用后面的变量来定义,但需防止递归定义,要有拓扑排序)),变量高级用法(
?=
,变量值替换,变量值再当变量),追加变量值(+=
,如果变量之前没有定义过,那么,+=会自动变成=),override指示符; - 跟我一起写 Makefile(八):多行变量(
define
…endef
),环境变量,目标变量,模式变量;使用条件变量(ifeq / ifneq / ifndef
,else
,endif
)(make是在读取Makefile时就计算条件表达式的值,并根据条件表达式的值来选择语句,所以最好不要把自动化变量(如“$@”等)放入条件表达式中,因为自动化变量是在运行时才有的); - 跟我一起写 Makefile(九):makefile函数使用(调用语法,
$(<function> <arguments>)
),makefile函数列表(字符串处理函数,文件名操作函数); - 跟我一起写 Makefile(十):foreach函数,if函数,call函数,origin函数,shell函数,控制make的函数;
- 跟我一起写 Makefile(十一) make的运行期间的规则和流程,含其中的状态码;
- 跟我一起写 Makefile(十二):隐含规则;
- 跟我一起写 Makefile(十三):定义模式规则,自动化变量;
- 跟我一起写 Makefile(十四):使用make更新函数库文件;
以上是关于makefile简略教程的主要内容,如果未能解决你的问题,请参考以下文章