一、介绍
1.Makefile概述
(1)make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE 都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make
(2)自动化编译:一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软 件开发的效率
(3)提高编译效率:再次编译,只编译修改的文件
2.Makefile基本语法
(1)Makefile基本结构
Makefile是Make读入的唯一配置文件
* 由make工具创建的目标体(target),通常是目标文件或可执行文件
* 要创建的目标体所依赖的文件(dependency_file)
* 创建每个目标体时需要运行的命令(command)
* 注意:命令行前面必须是一个”TAB键”,否则编译错误为:*** missing separator. Stop.
Makefile格式
target : dependency_files
<TAB> command
例子
hello.o : hello.c hello.h
gcc –c hello.c –o hello.o
3.具体编写makefile文档如下:
注:上面都是建立在所有文件都有的情况下,也可以不写makefile文档,直接编译即可
4.然后执行make即可如下:
注:自己定义的头文件要以”“为基准,然后.c文件中也保持一致”“
5.注意make只会编译修改后的文件,以及删除可执行文件.o,在执行make会重新生成的
6.在makefile文件中末尾加入clean,如下:
注:makefile执行时候,只执行一行的目标:依赖,后面就不执行了,所以要把最终的test: add.o...放在第一行,此时生成test的文件需要依赖三个.o文件,所以要去寻找一下当前3个文 件,如果有的话就追溯到.o文件哪来的,进而就执行后面的文件了,这也解释了为什么要把 最终文件放在第一行的原因了
运行时,要在make后面加入clean后如下:
7.如果该目录下存在相同文件的clean怎么办?
(1)vim Makefile,修改里面的文件加入目标:依赖关系
(2)然后就可以使用make clean:
二、Makefile创建变量的目的
1.创建目的的目的
*用来代替一个文本字符串
* 系列文件的名字
* 传递给编译器的参数
* 需要运行的程序
* 需要查找源代码的目录
* 你需要输出信息的目录
* 你想做的其它事情。
2.自定义变量
x=a 变量在声明时需要给予初值
$(x)或${x} 取值
如果你要使用真实的$字符,那么你需要$$来表示
3.一个自定义变量的小例子,就是基于上面的makefile文件中的来改写的
* 将之前的字符串给换成自定义的变量即可
*最后执行make发现没有报错
4.赋值的操作:
?=:前面定义赋值过了就不在赋值了
:=:前面赋值过了,在赋值定义一次
+=:追加赋值,在旧值上加上新值
三、自动变量
(1)指令:
$* 不包含扩展名的目标文件名称
$+ 所有的依赖文件,以空格分开,并以出现的先后为序,可能 包含重复的依赖文件
$< 第一个依赖文件的名称
$? 所有时间戳比目标文件晚的的依赖文件,并以空格分开
$@ 目标文件的完整名称
$^ 所有不重复的目标依赖文件,以空格分开
$% 如果目标是归档成员,则该变量表示目标的归档成员名称
(2)代码如下:
注:如果不想要不想要显示echo那一行指令,就在echo前加入@
(3)可以将makefile文件里进一步的替换:
四、Makefile的隐含变量
(1)保存命令的隐含变量
AR:库文件维护程序的名称
AS:汇编程序的名称
CC:C编译器的名称
CPP:C预编译器的名称
CXX:C++编译器的名称
FC:FORTRAN编译器的名称
RM:文件删除程序的名称
(2)隐含命令所用到的选项
ARFLAGS:库文件维护程序的选项
ASFLAGS:汇编程序的选项
CFLAGS:C编译器的选项
LDFLAGS:链接器的选项
CPPFLAGS:C预编译的选项
CXXFLAGS:C++编译器的选项
FFLAGS:FORTRAN编译器的选项
(3)案例如下:
注:-c -g -wall ,-g是可以gdb调试,-wall是可以报错,也可以指定头文件,比如:-I include(include当前目录下,如果不在当前目录就用绝对,/home/linux/Makefile/include)
五、Makefile的条件判断
(1)ifeq:判断是否相等
(2)ifneq:判断是否不相等
(3)ifdef:判断是否定义过,定义就是是否给赋值
(4)ifndef:判断是否未定义过
(5)案例如下:
注:ifeq与endif匹配,或者ifneq与else、endif相配对
六、Makefile函数
(1)Makefile函数
基本语法:
$(<function><arguments>) or ${<function><arguments>}
例如:$(wildcard PATTERN)
功能:列出当前目录下所有符合模式"PATTERN"格式的文件名
返回:空格分割的、存在当前目录的所有符合模”PATTERN“的文件名
说明:”PATTERN“使用shell可识别的通配符,包括”?“(单字符)、(多字符)等
(2)案例:$(wildcard *.c)返回值为当前目录下所有.c源文件列表
(3)$(patsubst <pattern>,<replacement>,<text>)
名称:模式字符串替换函数
功能:查找<text>中的单词(单词以:”空格“、”Tab“、”回车“、”换行“分隔)是否符合模 式<pattern>,如果匹配的话,则以<replacement>替换。这里,<pattern>可以包括通配 符%,表示任意长度的字串。如果<replacement>中也包含%,那么,<replacement>中的 这个%将是<pattern>中的%所表示的字串。(可以用\来转义,以\%来表示真实含义的%)
返回:函数返回被替换过后的字符串
例子:$(patsubst %.c,%.o,x.c.c bar.c)
把字串x.c.c bar.c 符合模式%.c的单词替换成%.o,返回结果是x.c.o、bar.o
(4)例子如下:
(5)Makefile自定义函数
示例:$(call <expression>,<parm2>,<parm3>...)