本系列(makefile)文章,从零基础开始,通过实验逐步分析makefile的语法特性,并最终打造一个可复用、可移植的专业编译环境。
参考:
1.DT 唐老师门徒计划课程
2.GNU make 手册:http://www.gnu.org/software/make/manual/make.html
hello: // 目标
echo “hello makefile” // 实现目标要执行的命令,注意行首是一个table(\t)
make -f mf.txt hello // -f表示指定mf.txt文件为规则定义文件(Makefile),并执行文件里的hello目标
make // 执行默认规则定义文件(Makefile/makefile)中的默认目标(第一个目标)
Makefile 用于定义源文件和依赖关系,说明如何编译各个源文件并生成可执行文件
依赖的定义:
targets:prerequests; command1
Command2
targets // 通常是需要生成的目标文件名,make所需要执行的命令名称
prerequisite // 当前目标所依赖的其他目标或文件
command // 完成目标所需要的命令
当目标对应的文件不存在,执行对应命令
当依赖在时间上比目标更新,执行对应命令
当依赖关系发生时,对比依赖链上每一个目标
hello.out all : func.o main.o
gcc -o hello.out func.o main.o
func.o : func.c
gcc -o func.o -c func.c
main.o : main.c
gcc -o main.o -c main.c
默认情况下,make认为目标对应着一个文件,make会比较文件和依赖关系的新旧关系,决定执行是否执行命令,make以文件处理作为第一优先级。
所以当出现和目标同名的文件时,则在文件不被更新的前提下,目标不会被执行
通过PHONY关键字声明一个伪目标,伪目标不对应任何实际的文件,不管伪目标的依赖时否更新,命令总是执行。
伪目标的语法:先声明,后使用
本质:伪目标是make中特殊的目标:.PHONY的依赖
.PHONY : clean
clean :
rm *.o hello.out -rf
规则调用,模拟C语言函数的概念。
原理:当一个目标的依赖包含伪目标时,伪目标所定义的命令总是会被执行。
.PHONY : rebuild clean all
rebuild : clean all
all : hello.out
clean :
rm *.o hello.out -rf
原理:如果一个规则没有命令或者依赖,并且他的目标不是一个存在的文件名,在执行此规则是,目标总会被认为是最新的。
clean : FORCE
rm *.o hello.out -rf
FORCE :
另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。