Makefile教程:11-14

Makefile教程:11-14

Makefile11:make参数

makefile教程11

就是指定make运行时,可以带上的参数。下面就是根据作用来分类,具体的就需要到时候去查了。

  • 指定makefile的文件
  • 指定文件执行的路径前缀
  • 展示所有变量
  • 执行相关的
    • 忽略文件更新时间,重新执行依赖
    • 忽视错误,继续执行 & 取消忽视错误,继续执行
    • 重新执行时,忽略一些发生修改的文件
    • 禁止自动推导
    • 不输出运行的命令
    • 限制同时启动的命令数量
  • 调试
    • 仅展示命令,不执行
    • 展示是否有目标发生更新
    • 根据指定文件,确定依赖这个文件的相关命令
    • 设定调试时,展示的调试信息多与少
  • 目标文件相关的
    • 更新文件的更新时间
    • 搜索目标文件
  • 类似makefile中的关键字
    • inlcude
    • override

Makefile 12:隐含规则

makefile 12

makefile 隐含规则就是makefile会自动推导依赖,而在这其中,其实就是由一些内置设置好的命令,然后这些命令是由一个一个变量组成的,我们可以修改这些变量来达到控制隐含规则的目的。

这里举上面隐含规则时中的代码例子,原来的makefile文件是:

index: main.o functions.o
	gcc main.o functions.o -o main

.PHONY:
clean:
	rm -rf main.o functions.o

这个时候运行:make就是运行:

cc    -c -o main.o main.c
cc    -c -o functions.o functions.c
gcc main.o functions.o -o main

其中隐含规则运行的命令格式是:

$(CC) –c $(CFLAGS) $(CPPFLAGS)

其中CC就是编译器,默认是cc,所以上面运行的命令就是cc -c -o main.o main.c,所以我们可以强制修改其为gcc,只需要像设定变量一样就可以了:

CC = gcc

index: main.o functions.o
	gcc main.o functions.o -o main

.PHONY:
clean:
	rm -rf main.o functions.o

这个时候运行make,执行的就是:

gcc    -c -o main.o main.c
gcc    -c -o functions.o functions.c
gcc main.o functions.o -o main

有了这个基础,就能看懂作者想表达的是啥了。具体的隐含规则我就没有去查了。

Makefile 13:自动化变量,修改隐含规则

makefile 13

自动变量

自动变量的一些例子,比如 @ , @, @<的内容就是在makefile中,一些含义随着情况发生改变,代表一类数据的变量。

其中:

  • $@,代表本条命令中的所有目标
  • $%,库函数中,代表本条命令中的所有目标
  • $<,代表本条命令中的所有依赖
  • $?,代表比目标新的(断一下句子)依赖目标的集合,比如目标A依赖目标B和目标C,其中目标B发生修改,那么在目标A的命令中,$?就代表目标B
  • $^,所有依赖目标的集合,注意$<代表的是依赖,而$^代表的是依赖目标的集合
  • $+,作用和$^一样,只是它不去重
  • $(@D),这个可以拆成这样来看:$@,然后其代表目录,所以$(@D),即所有目标的目录部分(不包含/
  • $(@F)$(@D)代表目录,那么$(@F)就代表文件

同理,$(%D),$(%F)也可以这样用,所以这里用$(*D)$(*F)来代表上面的组合。

修改隐含规则

这个其实本质上很简单,就是使用%来匹配字符,然后设定隐含规则的的内容,这里以makefile自动推导中的例子:

CC = gcc

index: main.o functions.o
	gcc main.o functions.o -o main

.PHONY:
clean:
	rm -rf main.o functions.o

上面是原本的makefile,其中有自动推导的规则在其中,下面我们显式表示规则:

CC = gcc

index: main.o functions.o
	gcc main.o functions.o -o main

# 这里就是我们修改了隐含规则
%.o: %.c
	gcc -c $< -o $@

.PHONY:
clean:
	rm -rf main.o functions.o

修改后执行的命令:

gcc -c main.c -o main.o
gcc -c functions.c -o functions.o
gcc main.o functions.o -o main

这个时候你会不会好奇,如果1个目标符合两个模式,它会如何抉择?

比如:

CC = gcc

index: main.o functions.o
	gcc main.o functions.o -o main

%.o: %.c
	gcc -c $< -o $@
# main.o 既符合上面的模式,也符合下面的,问,它会运行哪一个?
main.o: main.c
	cc -c main.c -o main.o

.PHONY:
clean:
	rm -rf main.o functions.o

答案是会运行main.o: mian.c的部分,原因我也暂时不知道。

Makefile 14:更新函数库文件

makefile 14

这个没有相关的经验,就直接跳过了。。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值