Gnu make学习笔记
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Gnu make学习笔记相关的知识,希望对你有一定的参考价值。
# 单行注释
# 多行注释:脚本语言大多是行注释;若想多行注释,建议每行首用#号。可替代方法是行尾续行符,但这样不太好
# Makefile规则结构
# target:[prerequisites]
# command
# 或者
# target:[prerequisites]; command
# 其中每条command需要以Tab开始,遵从shell语法。如果用“;”隔开的话,就不用Tab了
# 注意不要轻易以Tab开头,以Tab开头的命令都被交给系统shell去接手了
# make后执行的默认是第一条规则,即第一个target
# 路径上所依赖的target则是采用深度优先的递归策略逐个生成
# 不被默认target依赖的target将不会被执行,除非显式调用,比如make clean
#例子1: 最简单的Makefile
hello: main.o utils.o
cc -o hello main.o utils.o
main.o: main.c common.h
cc -c main.c
utils.o: utils.c common.h
cc -c utils.c
clean:
rm -rf hello main.o utils.o
#例子2: 用变量简化,加自动推导,Makefile默认支持cc -c main.c -o main.o自动推导出main.o,因此可省略
objects = main.o utils.o
hello: $(objects)
cc -o hello $(objects)
clean:
rm -rf hello $(objects)
# 默认Makefile:执行make时,依次找makefile -> Makefile,如果找不到就Stop;也可以利用自动推导,make xxx.o来编译单个文件
# 引用其他文件:其中“-”表示忽略错误
-include xxx/Makefile *.mk
# 变量定义:区别?
varA = xxx
VarB := xxx
# 变量定义中的通配符不会被通配处理,因此直接写*.o会被当做字符串,必须用wildcard函数
objects = *.o
objects = $(wildcard *.o)
# 多行变量的定义:define与endef之间包起来,会像宏一样完整展开到使用该多行变量的地方
# 条件分支:ifdef/ifndef/ifeq/ifneq
#P33
# 文件搜索路径:大型工程*.c和*.o不在同一目录时使用。如下第一种是固定写法,第二种是分类型通配,最后单个vpath是清除搜索路径
VPATH = src:inc:../headers
vpath %.c src
vpath %.h inc:../headers
vpath
# 自动化变量:
# “$^”代表所有通过目录搜索得到的依赖文件的完整路径名(目录 + 一般文件名)列表。
# “[email protected]”代表规则的目标
# “$<”代表规则中通过目录搜索得到的依赖文件列表的第一个依赖文件。
# 伪目标:避免当前目录下正好存在clean目标时出现困惑,另一个原因是考虑编译效率让其不生成依赖关系。方法是将其声明为.PHONY的依赖项
# 若不声明为伪目标,执行make clean时会先查找clean这个目标及其依赖关系,导致效率下降;声明为伪目标就是明确告诉它没有这个实体
# .PHONY声明后面的所有目标都是伪目标
.PHONY: clean
# 并发执行的依赖顺序,如下没有规则的target,只是指定依赖顺序,即dirA目录需要等待dirB目录先执行完make动作
dirA: dirB
#例子3: 全部通配的Makefile。此处使用了“:=”,原因?
objects := $(patsubst %.c,%.o, $(wildcard *.c))
hello: $(objects)
cc -o [email protected] $^
.PHONY: clean
clean:
rm -rf hello $(objects)
#P63
---- 《GNUMake.pdf》
以上是关于Gnu make学习笔记的主要内容,如果未能解决你的问题,请参考以下文章