版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
常州工程职业技术学院计算机技术系嵌入式C语言Makefile仲启秀
GCC编译过程:预编译、编译、汇编、链接
GCC命令行参数-E、-S、-c、-o-g、-OX、-Wall、-DDEBUG=1、-mcpu=i486-I、-L、-lname-static、-shared、-fPICGcc–fpic–c*.c|gcc–shared–olibpublic.so*.oGcc–I./incl–c*.c|ar
rcvs
libpublic.a*.ogcc-I./incl-otest1test.c-L.-static-lpublicgcc-otestlrc-I./incl-L./lib-lpublic–lcurces
testlrc.c(动态链接)如果链接的动态库不在/lib或/usr/lib目录下,需要把目录添加到/etc/ld.so.conf
文件里,并且执行ldconfig命令刷新ld.so.cache库相关的参数放到命令行的后面(-L–static–shared-l)Ncurses-5.3.4.i386.rpm包(如果目录中既有动态库又有静态库,则先找动态库链接,除非有-static指定要链接静态库)上节课知识回顾(1)为了让动态链接库为系统所共享,还需运行动态链接库的管理命令--ldconfig.此执行程序存放在/sbin目录下.ldconfig命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件.缓存文件默认为/etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表.ldconfig通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令./rc.d/rc.sysinit
ldconfig–n/lib上节课知识回顾(2)-ldconfiglrc.c
中LRC计算校验和函数编写情况Int2byte函数编写情况Public静态库和动态库是否生成?是否可以编写测试程序调用库里的LRC函数?上节课任务验收
Make工程及Makefile结构多文件的Makefile编写
C重点关键字介绍本次课程的基本知识点1.make工程管理器工程管理器,顾名思义,是指管理较多的文件Make工程管理器也就是个“自动编译管理器”,这里的“自动”是指它能够根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入Makefile文件文件的内容来执行大量的编译工作
1.1make工程管理器makefile是make读入的惟一配置文件,因此本节的内容实际就是讲述makefile的编写规则。在一个makefile中通常包含如下内容:需要由make工具创建的目标体(target),通常是目标文件或可执行文件;要创建的目标体所依赖的文件(dependency_file);创建每个目标体时需要运行的命令(command),这一行必须以制表符(tab键)开头。1.2makefile基本结构Makefile格式(1)makefile格式target:dependency_files<TAB >command/*该行必须以tab键开头*/target也就是一个目标文件,可以是ObjectFile,也可以是执行文件。还可以是一个标签(Label),对于标签这种特性,在后续的“伪目标”章节中会有叙述。prerequisites就是,要生成那个target所需要的文件或是目标。command也就是make需要执行的命令。(任意的Shell命令)例子Makefile1-基本格式(头文件在incl目录里,先全移到外边)hello:main.c
main.h
gcc–ohellomain.c$makehellogcc-ohellomain.c[root@localhosthello]#lsdisplay.c
display.hhelloincl
main.c
main.h
MakefileMakefile格式(2)Makfile
编译和链接分开的做法例子Makefile2hello:main.o
gcc–ohellomain.oMain.o:main.c
main.h
gcc–cmain.c–omain.oclean:
rm-rfhello*.o测试:$makehello注意:clean不是一个文件,它只不过是一个动作名字,有点像C语言中的lable一样,其冒号后什么也没有,那么,make就不会自动去找文件的依赖性,也就不会自动执行其后所定义的命令。要执行其后的命令,就要在make命令后明显得指出这个lable的名字。这样的方法非常有用,我们可以在一个makefile中定义不用的编译或是和编译无关的命令,比如程序的打包,程序的备份,等等Makefile格式(3)多文件链接在一起的Makefile(main.c中display函数调用出放开)例子Makefile3hello:main.o
display.o
gcc-ohellomain.o
display.omain.o:main.c
main.h
gcc-cmain.c-omain.odisplay.o:display.c
display.h
gcc-cdisplay.c-odisplay.o测试:$makehello1.3Makefile是如何工作的?1、make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
2、如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“hello”这个文件,并把这个文件作为最终的目标文件。
3、如果hello文件不存在,或是hello所依赖的后面的.o文件的文件修改时间要比hello这个文件新,那么,他就会执行后面所定义的命令来生成hello这个文件。
4、如果hello所依赖的.o文件也不存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件。(这有点像一个堆栈的过程)
5、当然,你的C文件和H文件是存在的,于是make会生成.o文件,然后再用.o文件生命make的终极任务,也就是执行文件hello了。这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件1.4创建和使用makefile变量观察Makefile3hello:main.o
display.o
gcc-ohellomain.o
display.omain.o:main.c
main.h
gcc-cmain.c-omain.odisplay.o:display.c
display.h
gcc-cdisplay.c-odisplay.oRm-rfhellodisplay.o
main.o注意以上例子,Gcc
被重复使用3次,main.o
display.o被重复使用2次,如果要新增加一个(.o)需要在两个地方加,非常不方便。因此引入变量,比如说定义OBJS=main.o
display.o,然后用$(OBJS)引用就好了使用变量的makefileMakefile4OBJS=main.o
display.oCC=gcc#CC=armv4l-unknown-linux-gcchello:$(OBJS)$(CC)-ohello$(OBJS)main.o:main.c
main.h$(CC)-cmain.c-omain.odisplay.o:display.c
display.h$(CC)-cdisplay.c-odisplay.oclean:
rm-rfhello$(OBJS)请看,如果把CC=armv4l-unknown-linux-gcc放开,然后make的话就完成了Arm平台的交叉编译,在目标平台上运行,看看效果。1.5Makefile
变量的增加Makefile5===>(+=追加或:=值替换Makefile6)OBJS=main.o
display.oOBJS+=sum.o#OBJS:=$(OBJS)sum.o(这个是重新赋值)CC=gcc#CC=armv4l-unknown-linux-gcchello:$(OBJS)$(CC)-ohello$(OBJS)main.o:main.c
main.h$(CC)-cmain.c-omain.odisplay.o:display.c
display.h$(CC)-cdisplay.c-odisplay.osum.o:sum.c
sum.h$(CC)-csum.c-osum.oclean:
rm-rfhello$(OBJS)1.6Makefile中缺省变量AR
函数库打包程序。默认命令是“ar”。
AS
汇编语言编译程序。默认命令是“as”。
CC
C语言编译程序。默认命令是“cc”。
CXX
C++语言编译程序。默认命令是“g++”。
CO
从RCS文件中扩展文件程序。默认命令是“co”。
CPP
C程序的预处理器(输出是标准输出设备)。默认命令是“$(CC)–E”。
CFLAGS
C语言编译器参数。
LDFLAGS
链接器参数。(如:“ld”)Makefile6
用了CFLAGS变量
CFLAGS+=-O–g-Wall1.7makefile中常见的自动变量和环境变量make在启动时会自动读取系统当前已经定义了的环境变量,并且会创建与之具有相同名称和数值的变量如果用户在makefile中定义了相同名称的变量,那么用户自定义变量将会覆盖同名的环境变量,为了不覆盖原来的变量需要用+=定义系统变量。1.8Makefile的规则makefile的规则是make进行处理的依据,它包括了目标体、依赖文件及其之间的命令语句。普通规则隐含规则模式规则隐式规则隐含规则能够告诉make怎样使用传统的规则完成任务,这样,当用户使用它们时就不必详细指定编译的具体细节,而只需把目标文件列出即可例子Makefile7OBJS=main.o
display.o#OBJS+=sum.oOBJS:=$(OBJS)sum.oCC=gcc#CC=armv4l-unknown-linux-gccCFLAGS+=-O-g-Wallhello:$(OBJS)$(CC)$(CFLAGS)-ohello$(OBJS)main.o:main.c
main.hdisplay.o:display.c
display.hsum.o:sum.c
sum.hclean:
rm-rfhello$(OBJS)模式规则-例子Makefile8模式规则是用来定义相同处理规则的多个文件的。它不同于隐式规则,隐式规则仅仅能够用make默认的变量来进行操作,而模式规则还能引入用户自定义变量,为多个文件建立相同的规则,从而简化了makefile的编写模式规则的格式类似于普通规则,这个规则中的相关文件前必须用“%”标明OBJS=main.o
display.o#OBJS+=sum.oOBJS:=$(OBJS)sum.oCC=gcc#CC=armv4l-unknown-linux-gccCFLAGS+=-O-g-Wallhello:$(OBJS)$(CC)-o$@$^%.o:%.c
%.h$(CC)$(CFLAGS)-c$<-o$@clean:
rm-rfhello$(OBJS)注意%.h的使用…将头文件放到incl目录下时,此时必须指定-I参数给GCC,否则会报头文件找不到。例子Makefile9OBJS=main.o
display.o#OBJS+=sum.oOBJS:=$(OBJS)sum.oCC=gcc#CC=armv4l-unknown-linux-gccCFLAGS+=-O-g-WallINCDIR=-I.-I./inclhello:$(OBJS)$(CC)-o$@$^%.o:%.c./incl/%.h$(CC)$(CFLAGS)$(INCDIR)-c$<-o$@clean:
rm-rfhello$(OBJS)Makefile
中GCC的-I参数生成libmat.a
静态库,hello中连接此静态库。例子:Makefile10OBJS=main.o
display.oLIB_OBJS=sum.o
dec.oCC=gcc#CC=armv4l-unknown-linux-gccCFLAGS+=-O-g-WallINCDIR=-I.-I./inclLDFLAG=-L.-L./lib-lmatLDTARGET=libmat.ahello:$(OBJS)$(CC)-o$@$^$(LDFLAG)$(LDTARGET):$(LIB_OBJS)$(AR)cr$@$^
mv$@./lib/.%.o:%.c./incl/%.h$(CC)$(CFLAGS)$(INCDIR)-c$<-o$@clean:
rm-rfhello$(OBJS)1.9Makefile
生成静态库动态库的中编译产生.o文件时,需要带-fPIC参数;动态库链接是需要带-shared参数动态库需要放在/usr/lib目录下例子Makefile11LIB_OBJS=sum.o
dec.oCC=gcc#CC=armv4l-unknown-linux-gccCFLAGS=-fPIC-WallLDTARGET=libmat.so$(LDTARGET):$(LIB_OBJS)$(CC)-shared-o$@$^
mv$(LDTARGET)/usr/lib%.o:%.c./incl/%.h$(CC)$(CFLAGS)$(INCDIR)-c$<-o$@clean:
rm-rf$(LIB_OBJS)1.10Makefile
生成动态库动态库需要放在/usr/lib、/lib系统默认的路径下,或在/etc/ld.conf里注册,或者修改LD_LIBRARY_PATH路径。例子Makefile12OBJS=main.o
display.oCC=gcc#CC=armv4l-unknown-linux-gccCFLAGS+=-O-g-WallINCDIR=-I.-I./inclLDFLAG=-L.-L./lib-lmathello:$(OBJS)$(CC)-o$@$^$(LDFLAG)%.o:%.c./incl/%.h$(CC)$(CFLAGS)$(INCDIR)-c$<-o$@clean:
rm-rfhello$(OBJS)1.11链接动态库的Makefile1.12make的命令行选项1.13Make中的函数(1)(自学)字符串处理函数
$(subst<from>,<to>,<text>)
名称:字符串替换函数——subst。
功能:把字串<text>中的<from>字符串替换成<to>。
返回:函数返回被替换过后的字符串。$(patsubst<pattern>,<replacement>,<text>)
名称:模式字符串替换函数——patsubst。
功能:查找<text>中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式<pattern>,如果匹配的话,则以<replacement>替换。这里,<pattern>可以包括通配符“%”,表示任意长度的字串。如果<replacement>中也包含“%”,那么,<replacement>中的这个“%”将是<pattern>中的那个“%”所代表的字串。(可以用“\”来转义,以“\%”来表示真实含义的“%”字符)
返回:函数返回被替换过后的字符串。
Make中的函数(2)(自学)$(dir<names...>)
名称:取目录函数——dir。$(foreach<var>,<list>,<text>)
这个函数的意思是,把参数<list>中的单词逐一取出放到参数<var>所指定的变量中,然后再执行<text>所包含的表达式。每一次<text>会返回一个字符串,循环过程中,<text>的所返回的每个字符串会以空格分隔,最后当整个循环结束时,<text>所返回的每个字符串所组成的整个字符串(以空格分隔)将会是foreach函数的返回值。if函数
$(if<condition>,<then-part>,<else-part>)
1.14Make中的语法(自学)示例一:
bar=
foo=$(bar)
ifdef
foo
frobozz=yes
else
frobozz=no
endif
示例二:
foo=
ifdef
foo
frobozz=yes
else
frobozz=no
endif
课堂(课外)练习1.将public中ascbcd.c完成ascii到bc
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《保险理财知识讲座》课件
- 图书工作计划加强对图书采编质量的监督提高藏书水平
- 常温远红外陶瓷及制品相关行业投资规划报告
- 石膏制品运输协议三篇
- 医用氮气系统相关行业投资方案范本
- 放射性废气处置设备相关项目投资计划书范本
- 营造积极向上的班级气氛计划
- 我的家乡湖口
- 生物上册动物行为的生理基础课件苏教
- 《设计法规与标准》课件
- 2024-2030年中国呼叫中心外包行业市场发展趋势与前景展望战略分析报告
- 安全生产法律法规清单(2024年5月版)
- 全约艺人合同范本
- 学生评语大全【120则】
- 江苏开放大学本科行政管理专业050004行政管理学期末试卷
- 黑布林-Peter-Pan-故事人物介绍-分析-探讨
- 应聘科研助理的工作规划
- 部编三年级语文《翠鸟》课件
- 宣传视频拍摄服务投标技术方案技术标
- 2024年小学三年级英语家长会课件-(带附加条款)
- 材料科技有限公司年产12500吨电子冷却液项目环评可研资料环境影响
评论
0/150
提交评论