




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Makefile案例本章目标(1)make与Makefile介绍(2)Makefile基本规则(3)简单的Makefile编写(4)Make自动化变量(5)Makefile编译多个可执行文件(6)make常用内嵌函数(7)多级目录Makefile案例一:基本的Makefile编写touch main.c add.c add.h sub.c sub.hvim Makefilemain:main.o add.o sub.ogcc -Wall -g main.o add.o sub.o -o mainmain.o:main.cgcc -Wall -g -c main.c -o main.oadd.o:add.c add.h gcc -Wall -g -c add.c -o add.osub.o:sub.c sub.hgcc -Wall -g -c sub.c -o sub.omake(解释结果)再次make(没有改动文件;解释结果)touch sub.h再次make(改动了sub.h;解释结果)增加伪目标cleanclean:rm -f main main.o add.o sub.omake clean(对应VS中的“清除”)ls(看一下删除后的结果)make main.o(表示只需要生成main.o;对应VS中的“编译”).PHONY:clean(显示指定clean是一个伪目标)#.PHONY:clean(注释用#)解释如果没有.PHONY:clean会出现什么情况(1.当前目录没有clean文件;2.当前目录有clean文件(touch clean);make clean就会出错)案例二:自定义和自动化变量(1)makefile有重复,可以自定义变量(2)makefile自动化变量$ 规则的目标文件名$ 规则的第一个依赖文件名$ 规则的所有依赖文件列表main:main.o add.o sub.omain 规则的目标文件名main.o 规则的第一个依赖文件名main.o add.o sub.o 规则的所有依赖文件列表.PHONY:cleanOBJECTS=main.o add.o sub.o #自定义变量CC=gcc CFLAGS=-Wall -gmain:$(OBJECTS)$(CC) $(CFLANGS) $ -o $main.o:main.c$(CC) $(CFLANGS) -c $ -o $add.o:add.c add.h $(CC) $(CFLANGS) -c $ -o $sub.o:sub.c sub.h$(CC) $(CFLANGS) -c $ -o $clean:rm -f main $(OBJECTS)makefile文件名(1)Makefile (2)makefile (3)其他文件名:如Make.makefile(使用的时候需要选项-f)为了演示清楚:clean:echo “begin to delete.”对比:echo “begin to delete.”gcc .案例三:Makefile编译多个可执行文件例子:test1.c和test2.c都有main函数.PHONY:clean all或.PHONY:cleanBIN=test1 test2all:$(BIN)clean:rm -f $(BIN)make后就可以生成可执行文件test1 test2查看输出: cc test1.c -o test1 cc test2.c -o test2解释:(all是一个伪目标)隐含推导规则:同名的.c文件生成同名的可执行文件(不使用隐含规则,使用显式规则).PHONY:clean allBIN=test1 test2all:$(BIN)test1:test1.ogcc -Wall -g $ -o $test2:test2.ogcc -Wall -g $ -o $clean:rm -f *.o $(BIN)make之后观察输出,并解释tes1.o和tes2.o的产生也依赖自动推导规则案例四:模式规则和后缀规则模式规则:%.o:%.c后缀规则:.c.o:.PHONY:clean allBIN=test1 test2all:$(BIN)%.o:%.cgcc -Wall -g -c $ -o $test1:test1.ogcc -Wall -g $ -o $test2:test2.ogcc -Wall -g $ -o $clean:rm -f *.o $(BIN)解释输出结果用.c.o:gcc -Wall -g -c $ -o $结果类似%.o:%.c(增加变量CC=gcc CFLAGS=-Wall -g)注释掉下面信息,看结果 test1:test1.ogcc -Wall -g $ -o $ test2:test2.ogcc -Wall -g $ -o $增加test3.c增加pub.c pub.h(test3依赖文件test3.c pub.h pub.c)增加test4.c(作为测试程序;在BIN后加test4就行,轻松)make常用内嵌函数(1)函数调用$(function arguments)(2)$(wildcard PATTERN) 当前目录下匹配模式的文件 如src=$(wildcard *.c)(3)$(patsubst PATTERN,REPLACEMENT,TEXT) 模式替换函数 如$(patsubst %.c,%.o,$src) 等价于$(src:.c=.o)(4)shell函数 执行shell命令 如$(shell ls -d */)(显示目录)案例五:多级目录Makefile二级或三级目录例子/ main.c / bll目录:bll.c bll.h/ bll/test目录:test.c test.h/ ui目录:ui.c ui.h/ dal目录:dal.c dal.hMakefile.PHONY:cleanCC=gccCFLAGS=-Wall -gBIN=mainSUBDIR=$(shell ls -d */)ROOTSRC=$(wildcard *.c)ROOTOBJ=$(ROOTSRC:%.c=%.o)SUBSRC=$(shell find $(SUBDIR) -name *.c)SUBOBJ=$(SUBSRC:%.c=%.o)$(BIN):$(ROOTOBJ) $(SUBOBJ)$(CC) $(CFLAGS) -o $(BIN) $(ROOTOBJ) $(SUBOBJ).c.o:$(CC) $(CFLAGS) -c $ -o $clean:rm -f $(BIN) $(ROOTOBJ) $(SUBOBJ)解释和演示案例六:多级目录的Makefile/test1目录:Makefile test1.c /test2目录:Makefile test2.cpp先看MakefileSUBDIRS=test1 test2.PHONY:default all clean $(SUBDIRS)default:allall clean:$(MAKE) $(SUBDIRS) TARGET=$(SUBDIRS):$(MAKE) -C $ $(TARGET)再看makefile的输出结果,进行解释结果:make test1 test2 TARGET=allmake1: Entering directory /home/panlei/linux/makefile/mulmakefilemake -C test1 allmake2: Entering directory /home/panlei/linux/makefile/mulmakefile/test1- make all in /home/panlei/linux/makefile/mulmakefile -gcc -c test1.cgcc test1.o -o test1make2: Leaving directory /home/panlei/linux/makefile/mulmakefile/test1make -C test2 allmake2: Entering directory /home/panlei/linux/makefile/mulmakefile/test2- make all in /home/panlei/linux/makefile/mulmakefile -g+ -Wall -g -c -o test2.o test2.cppg+ -Wall -g test2.o -o test2make2: Leaving directory /home/panlei/linux/makefile/mulmakefile/test2make1: Leaving directory /home/panlei/linux/makefile/mulmakefile解释:make test1 test2 TARGET=all ($(MAKE)=make)make -C test1 all (-C:等价于make all test1/Makefile;传递all,执行test/Makefile)test1/MakefileCC=gccBIN=test1OBJS=test1.o.PHONY:all clean printall:print $(BIN)print:echo - make all in $(PWD) -$(BIN):$(OBJS)$(CC) $(OBJS) -o $%.o:%.c$(CC) -c $clean:echo - make clean in $(PWD) -rm -f $(BIN) $(OBJS)test2/MakefileCXX=g+BIN=test2OBJS=test2.oCPPFLAGS=-Wall -g.PHONY:all clean printall:print $(BIN)print:echo - make all in $(PWD) -$(BIN):$(OBJS)$(CXX) $(OBJS) -o $%.o:%.cpp$(CXX) -c $clean:echo - make clean
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年宠物美容AI技术面试题库
- 2025年安全战略填空题库
- 2025年导盲犬训练高级面试实战题库
- 2025年广播电视台后期制作面试常见问题解答
- 2025年语音合成师职业发展面试题及答案
- 2025年高效学习方法与技巧高级笔试预测题
- 2025年地震救援面试重点题解析及答案
- 2025年建筑装饰设计师专业技术考核试卷及答案解析
- 课件中控件的使用
- 2025年环保工程技术师资格考试试题及答案解析
- 2025年中级会计职称考试经济法冲刺试题及答案
- 乐器供销合同范本
- 2025年辽宁省中考生物学试卷真题附答案
- 2025-2030牛肉分销渠道冲突与供应链协同优化报告
- 《法律职业伦理(第3版)》全套教学课件
- 2025年青岛市崂山旅游集团招聘考试笔试试题
- 2025年秋季新学期全体中层干部会议校长讲话:在挑战中谋突破于坚实处启新篇
- 2025年幼儿园保育员考试试题(附答案)
- 2025年上半年中国铁路兰州局集团有限公司校招笔试题带答案
- 《物联网导论》课程标准
- 供水抄表员安全知识培训课件
评论
0/150
提交评论