版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Gcc & makefile大纲 Gcc根底 Gdb根底 Makefile根底根本语法,变量,函数 静态链接库和动态链接库makefile的编写使用使用GNU cc开发应用程序开发应用程序 使用使用GNU cc 1gcc的简介的简介 gcc可以使程序员灵敏地控制编译过程。编译过程一般可以分为下面四个阶段,每个阶段分别调用不同的工具进展处理,如图9-18所示。 预处理链接编译组译源程序(*.c)可执行文件预处理器编译器组译器连接器3gcc的使用的使用 gcc的使用格式如下:$ gcc optionsfilenames其中filenames为所要编译的程序源文件。 当使用gcc时,gcc会
2、完成预处理、编译、汇编和连接。前三步分别生成目的文件,连接时,把生成的目的文件链接成可执行文件。 无论是C、C+、还是pas,首先要把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Object File,这个动作叫做编译compile。然后再把大量的Object File合成执行文件,这个动作叫作链接link。编译时,编译器需要的是语法的正确,函数与变量的声明的正确。 对于后者,通常是需要告诉编译器头文件的所在位置头文件中应该只是声明,而定义应该放在C/C+文件中 只要所有的语法正确,编译器就可以编译出中间目的文件。一般来说,每个源文件都应该
3、对应于一个中间目的文件O文件或是OBJ文件。链接时,主要是链接函数和全局变量,可以使用中间目的文件O文件或是OBJ文件来链接应用程序。 链接器并不管函数所在的源文件,只管函数的中间目的文件Object File,在大多数时候,由于源文件太多,编译生成的中间目的文件太多,而在链接时需要明显地指出中间目的文件名,这对于编译很不方便,所以要给中间目的文件打个包,在Windows下这种包叫“库文件Library File,也就是 .lib 文件,在UNIX下,是Archive File,也就是 .a 文件。总结一下 源文件首先会生成中间目的文件,再由中间目的文件生成执行文件。 在编译时,编译器只检测程
4、序语法,和函数、变量是否被声明。假如函数未被声明,编译器会给出一个警告,但可以生成Object File。 而在链接程序时,链接器会在所有的Object File中找寻函数的实现,假如找不到,那到就会报链接错误码Linker Error.makefile文件的作用 makefile文件保存了编译器和连接器的参数选项,还表述了所有源文件之间的关系源代码文件需要的特定的包含文件,可执行文件要求包含的目的文件模块及库等.Makefile文件工作原理 创立程序make程序首先读取makefile文件, 然后再激活编译器,汇编器,资源编译器和连接器以便产生最后的输出 最后输出并生成的通常是可执行文件.
5、创立程序利用内置的推理规那么来激活编译器,以便通过对特定CPP文件的编译来产生特定的OBJ文件. 一个Makefile文件主要含有一系列的规那么,每条规那么包含以下内容。一个目的target,即make最终需要创立的文件,如可执行文件和目的文件;目的也可以是要执行的动作,如“clean。一个或多个依赖文件dependency列表,通常是编译目的文件所需要的其他文件。 一系列命今command,是make执行的动作,通常是把指定的相关文件编译成目的文件的编译命令,每个命令占一行,且每个命令行的起始字符必须为TAB字符。 makefile文件的根本构造文件的根本构造 Makefile规那么的一般形
6、式如下:target:dependency1 dependency2 tabtarget是需要创立的二进制文件或目的文件dependency是在创立target时需要用到的一个或多个文件的列表command命令序列是创立target文件所需要执行的步骤,比方编译命令。 # 一个简单的Makefile的例子# 以#开头的为注释行test:prog.o code.ogcc o test prog.o code.o prog.o:prog.c prog.h code.hgcc c prog.c o prog.o code.o:code.c code.hgcc c code.c o code.o cl
7、ean:rm f *.o Makefile里有什么?Makefile里主要包含了五个东西:显式规那么、隐晦规那么、变量定义、文件指示和注释。1、显式规那么。显式规那么说明了,如何生成一个或多的的目的文件。这是由Makefile的书写者明显指出,要生成的文件,文件的依赖文件,生成的命令。2、隐晦规那么。由于我们的make有自动推导的功能,所以隐晦的规那么可以让我们比较粗糙地简单地书写Makefile,这是由make所支持的。3、变量的定义。在Makefile中我们要定义一系列的变量,变量一般都是字符串,这个有点像C语言中的宏,当Makefile被执行时,其中的变量都会被扩展到相应的引用位置上。M
8、akefile里有什么?4、文件指示。其包括了三个部分,一个是在一个Makefile中引用另一个Makefile,就像C语言中的include一样。5、注释。Makefile中只有行注释,和UNIX的Shell脚本一样,其注释是用“#字符,这个就像C/C+中的“/一样。假如要在你的Makefile中使用“#字符,可以用反斜框进展转义,如:“/#。最后,还值得一提的是,在Makefile中的命令,必需要以Tab键开场。Makefile中的变量是用一个文本串在Makefile中定义的,这个文本串就是变量的值。只要在一行的开场写下这个变量的名字,后面跟一个“号,以及要设定这个变量的值即可定义变量,下
9、面是定义变量的语法:VARNAME=string使用时,把变量用括号括起来,并在前面加上$符号,就可以引用变量的值: $VARNAME make解释规那么时,VARNAME在等式右端展开为定义它的字符串。变量一般都在Makefile的头部定义。按照惯例,所有的Makefile变量都应该是大写。假如变量的值发生变化,就只需要在一个地方修改,从而简化了Makefile的维护。 Makefile中的变量如今利用变量把前面的Makefile重写一遍:OBJS=prog.o code.oCC=gcc test:$ OBJS $ CC o test $ OBJS prog.o:prog.c prog.h
10、code.h$ CC c prog.c o prog.o code.o:code.c code.h$ CC c code.c o code.o clean:rm f *.o 除用户自定义的变量外,make还允许使用环境变量、自动变量和预定义变量。使用环境变量的方法很简单,在make启动时,make读取系统当前已定义的环境变量,并且创立与之同名同值的变量,因此用户可以像在shell中一样在Makefile中方便的引用环境变量。形式规那么 形式规那么中,至少在规那么的目的定义中要包含%,否那么,就是一般的规那么。 目的中的“%定义表示对文件名的匹配,“%表示长度任意的非空字符串。 “%.c表示以“
11、.c结尾的文件名文件名的长度至少为3 而s.%.c那么表示以s.开头,.c结尾的文件名文件名的长度至少为5。 假如%定义在目的中,那么,目的中的%的值决定了依赖目的中的%的值,也就是说,目的中的形式的%决定了依赖目的中%的样子。例如有一个形式规那么如下: %.o : %.c ; 其含义是,指出了怎么从所有的.c文件生成相应的.o文件的规那么。假如要生成的目的是a.o b.o,那么%c就是a.c b.c。形式规那么例如 下面这个例子表示了,把所有的.c文件都编译成.o文件. %.o : %.c $CC -c $CFLAGS $CPPFLAGS $ -o $ 其中,“$表示所有的目的的每个值,$表
12、示了所有依赖目的的挨个值。这些奇怪的变量叫自动化变量,形式规那么例如 下面的这个例子中有两个目的是形式的: %.tab.c %.tab.h: %.y bison -d $ 这条规那么告诉make把所有的.y文件都以 bison d .y执行,然后生成.tab.c和.tab.h文件。其中,表示一个任意字符串。 假如执行程序foo依赖于文件parse.tab.o和scan.o,并且文件scan.o依赖于文件“parse.tab.h,假如parse.y文件被更新了,那么根据上述的规那么,bison d parse.y就会被执行一次,于是,parse.tab.o和scan.o的依赖文件就齐了。自动化变
13、量 在上述的形式规那么中,目的和依赖文件都是一系例的文件,那么我们如何书写一个命令来完成从不同的依赖文件生成相应的目的?因为在每一次的对形式规那么的解析时,都会是不同的目的和依赖 文件。 自动化变量就是完成这个功能的。在前面,我们已经对自动化变量有所提涉,相信你看到这里已对它有一个感性认识了。所谓自动化变量,就是这种变量会把形式中所定义的一系列的文件自动地 挨个取出,直至所有的符合形式的文件都取完了。这种自动化变量只应出如今规那么的命令中。自动化变量下面是所有的自动化变量及其说明:$表示规那么中的目的文件集。在形式规那么中,假如有多个目的,那么,$就是匹配于目的中形式定义的集合。$%仅当目的是
14、函数库文件中,表示规那么中的目的成员名。例如,假如一个目的是foo.abar.o,那么,$%就是bar.o,$就是foo.a。假如目的不是函数库文件Unix下是.a,Windows下是.lib,那么,其值为空。$依赖目的中的第一个目的名字。假如依赖目的是以形式即%定义的,那么$将是符合形式的一系列的文件集。注意,其是一个一个取出来的。$?所有比目的新的依赖目的的集合。以空格分隔。$所有的依赖目的的集合。以空格分隔。假如在依赖目的中有多个重复的,那个这个变量会去除重复的依赖目的,只保存一份。例子TARGET=helloworldCC=gccCFLAGS=-Wall -O -gSRC=$wildc
15、ard *.cOBJS=$patsubst %.c,%.o,$wildcard *.c$TARGET:$OBJS$CC $CFLAGS $OBJS -o $# $RM *.o%.o: %.c$CC $CFLAGS -c $ -o $clean:rm -rf *.o helloworld Makefile中的变量交换 1、wildcard : 扩展通配符 2、notdir : 去除途径 3、patsubst :交换通配符 Makefile中的变量交换 建立一个简单的makefile src=$wildcard *.c ./sub/*.c dir=$notdir $src obj=$patsubs
16、t %.c,%.o,$dir all: echo $src echo $dir echo $obj echo endMakefile中的变量交换 建立一个简单的makefile src=$wildcard *.c ./sub/*.c 第一行输出: a.c b.c ./sub/sa.c ./sub/sb.c wildcard把 指定目录 ./ 和 ./sub/ 下的所有后缀是c的文件全部展开。 Makefile中的变量交换 dir=$notdir $src 第二行输出: a.c b.c sa.c sb.c notdir把展开的文件去除掉途径信息 Makefile中的变量交换 obj=$patsubst %.c,%.o,$dir 第三行输出: a.o b.o sa.o sb.o 在$patsubst %.c,%.o,$dir 中,patsubst把$dir中的变量符合后缀是.c的全部交换成.o例1例2例2linux下编译自己的库文件理论 inux下文件的类型是不依赖于其后缀名的,但一般来讲: .o,是目的文件,相当于windows中的.obj文件 .so 为共享库,是shared object,用于动态连接的,和dll差不多 .a为静态库,是好多个.o合在一起,用于静态连接 1.创立静态.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 大班上学期科学教案:地球仪上的中国
- 中班音乐详案教案及教学反思《捡豆豆》
- 二年级上数学教案-认识时间(一)-人教新课标
- 《分与合》(教案)2023-2024学年数学一年级上册 人教版
- 建筑工地疫情防控网格化管理
- 住院处家庭纠纷应急预案
- 2017春沪科版八年级物理下册第九章同步教案9.3物体的浮与沉
- 2024年临时摊位租赁协议样本
- 区域教案小班9篇
- 2024年内衣原料及成品采购合同
- 人员支援工作申请单
- 国家开放大学实验学院生活中的法律形考任务(一)-形考任务(一)答案
- 幼儿园教师师德师风考核表
- 2022年江苏省南京市栖霞区南外仙林分校小学部六上期中数学试卷
- (完整版)砂石料场开采专项方案
- 真想变成大大的荷叶(详案)
- 原生家庭与个人成长(课堂PPT)
- 货代公司规章制度管理办法范本
- 医学英语教程(2)ppt课件
- 物理图库(几乎包含所有初中物理图片)
- 铜仁市房地产市场调查分析报告专业课件
评论
0/150
提交评论