一、介绍
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>...)
????????????????
????????????????
????????????????