makefile 记录

本文详细介绍了Makefile的相关知识,包括伪目标`.PHONY`、特殊符号如`$@`、`$^`、`$<`、`$?`的用法,MD5校验和计算,格式规则的定义,命令包装,变量替换,追加变量,目标变量,文件名操作函数,条件判断语句`ifeq`,以及函数`call`等。通过对这些核心概念的解析,帮助读者掌握Makefile的编写技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    1,.PHONY: 伪目标是这样一个目标:它不代表一个真正的文件名,在执行make时可以指定这个目标来执行所在规则定义的命令,有时也可以将一个伪目标称为标签。伪目标通过PHONY来指明。

比如,我们常用的make clean, 如果当前文件下有一个clean文件,就会命令出错,此时通过标签来识别就可以了。

    2,特殊符号

$@  表示目标文件
$^  表示所有的依赖文件
$<  表示第一个依赖文件
$?  表示比目标 还要新的依赖文件 列表(集合)

hello.o: hello.c
        cc -c hello.c
        
hello.o: hello.c
        cc -c $<

    3,MD5 全称是报文摘要算法(Message-Digest Algorithm 5),此算法对任意长度的信息逐位进行计算,产生一个二进制长度为128位(十六进制长度就是32位)的“指纹”(或称“报文摘要”。md5sum命令采用MD5报文摘要算法(128位)计算和检查文件的校验和

    md5sum test.c > text.txt

    cat text.txt

    4,格式规则

target... : prerequisites ...

          command

target:一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label),对于标签这种特性,在后续的“伪目标”章节中会有叙述。

prerequisites:要生成那个target所需要的文件或是目标。

command:make需要执行的命令。注意tab键开头(任意的Shell命令)

    5,make -f Make.Linux,指定makefile文件。引用其它的Makefile:include Make.Linux

    6,文件搜寻,VPATH = src:../headers(: 隔开)/

vpath %.c foo:在foo目录下匹配.c文件

    7,命令包:

define run-yacc

   yacc $(firstword $^)

   mv y.tab.c $@

   endef

    8,变量替换 

foo := a.o b.o c.o
bar := $(foo:.o=.c)

“$(bar)”的值就是“a.c b.c c.c”

    9,追加变量 

objects = main.o foo.o bar.o utils.o
objects += another.o

$(objects)值变成:“main.o foo.o bar.o utils.o another.o”

    10,默认配置命令行参数:override <variable> = <value>

    11,目标变量:它的作用范围只在这条规则以及连带规则中,其值也只在作用范围内有效,而不会影响规则链以外的全局变量的值。

<target ...> : <variable-assignment>,赋值表达式,如“=”、“:=”、“+=”或是“?=”

    12,函数:$(<function> <arguments> ) / ${<function> <arguments>}

    13,文件名操作函数

$(dir <names...> ):取目录(最后一个'/'之前字符串)

$(notdir <names...> ):取文件(最后一个'/'之后字符串)

$(suffix <names...> ):取文件后缀

$(basename <names...> ):取前缀(包括路径) 

    14,foreach 函数

$(foreach <var>,<list>,<text>):把参数<list>中的单词逐一取出放到参数<var>所指定的变量中,然后再执行<text>所包含的表达式。

    15,if 函数

$(if <condition>,<then-part>,<else-part> ):<condition>参数是if的表达式,如果其返回的为非空字符串,那么这个表达式就相当于返回真

ifeq ($(CC),gcc)
$(CC) -o foo $(objects) $(libs_for_gcc)
else
$(CC) -o foo $(objects) $(normal_libs)
endif

    16,call 函数

reverse = $(2) $(1)
foo = $(call reverse,a,b)
此时的foo的值就是“b a”。

    17,错误打印:$(error <text ...> )

 

其他细节可参考 https://blog.youkuaiyun.com/weixin_38391755/article/details/80380786

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值