Linux中Makefile用法及变量

发布时间:2024年01月23日

一、介绍

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>...)

????????????????

????????????????

????????????????

文章来源:https://blog.csdn.net/weixin_58036810/article/details/135681117
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。