版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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+文件中) 只要所有的语法正确,编译器就可以编译出中间目标文件。一般来说,每个源文件都应该对应于一个中间目标文件(O文件或是
3、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规则的一般形式如下:target:depe
6、ndency1 dependency2 (tab)target是需要创建的二进制文件或目标文件dependency是在创建target时需要用到的一个或多个文件的列表command命令序列是创建target文件所需要执行的步骤,比如编译命令。 # 一个简单的Makefile的例子# 以#开头的为注释行test:prog.o code.ogcc o test prog.o code.oprog.o:prog.c prog.h code.hgcc c prog.c o prog.ocode.o:code.c code.hgcc c code.c o code.oclean:rm f *.o Mak
7、efile里有什么?Makefile里主要包含了五个东西:显式规则、隐晦规则、变量定义、文件指示和注释。1、显式规则。显式规则说明了,如何生成一个或多的的目标文件。这是由Makefile的书写者明显指出,要生成的文件,文件的依赖文件,生成的命令。2、隐晦规则。由于我们的make有自动推导的功能,所以隐晦的规则可以让我们比较粗糙地简略地书写Makefile,这是由make所支持的。3、变量的定义。在Makefile中我们要定义一系列的变量,变量一般都是字符串,这个有点像C语言中的宏,当Makefile被执行时,其中的变量都会被扩展到相应的引用位置上。Makefile里有什么?4、文件指示。其包括
8、了三个部分,一个是在一个Makefile中引用另一个Makefile,就像C语言中的include一样。5、注释。Makefile中只有行注释,和UNIX的Shell脚本一样,其注释是用“#”字符,这个就像C/C+中的“/”一样。如果要在你的Makefile中使用“#”字符,可以用反斜框进行转义,如:“/#”。最后,还值得一提的是,在Makefile中的命令,必须要以Tab键开始。Makefile中的变量是用一个文本串在Makefile中定义的,这个文本串就是变量的值。只要在一行的开始写下这个变量的名字,后面跟一个“”号,以及要设定这个变量的值即可定义变量,下面是定义变量的语法:VARNAME
9、=string使用时,把变量用括号括起来,并在前面加上$符号,就可以引用变量的值: $VARNAME make解释规则时,VARNAME在等式右端展开为定义它的字符串。变量一般都在Makefile的头部定义。按照惯例,所有的Makefile变量都应该是大写。如果变量的值发生变化,就只需要在一个地方修改,从而简化了Makefile的维护。 Makefile中的变量现在利用变量把前面的Makefile重写一遍:OBJS=prog.o code.oCC=gcctest:$ OBJS $ CC o test $ OBJS prog.o:prog.c prog.h code.h$ CC c prog.c
10、 o prog.ocode.o:code.c code.h$ CC c code.c o code.oclean:rm f *.o 除用户自定义的变量外,make还允许使用环境变量、自动变量和预定义变量。使用环境变量的方法很简单,在make启动时,make读取系统当前已定义的环境变量,并且创建与之同名同值的变量,因此用户可以像在shell中一样在Makefile中方便的引用环境变量。模式规则模式规则中,至少在规则的目标定义中要包含%,否则,就是一般的规则。目标中的“%”定义表示对文件名的匹配,“%”表示长度任意的非空字符串。“%.c”表示以“.c”结尾的文件名(文件名的长度至少为3)而s.%.
11、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: %.ybison -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、何书写一个命令来完成从不同的依赖文件生成相应的目标?因为在每一次的对模式规则的解析时,都会是不同的目标和依赖文件。自动化变量就是完成这个功能的。在前面,我们已经对自动化变量有所提涉,相信你看到这里已对它有一个感性认识了。所谓自动化变量,就是这种变量会把模式中所定义的一系列的文件自动地挨个取出,直至所有的符合模式的文件都取完了。这种自动化变量只应出现在规则的命令中。自动化变量下面是所有的自动化变量及其说明:$表示规则中的目标文件集。在模式规则中,如果有多个目标,那么,$就是匹配于目标中模式定义的集合。$%仅当目标是函数库文件中,表示规则中的目标成员名。例如,如果一个目标是foo.a(bar.o)
14、,那么,$%就是bar.o,$就是foo.a。如果目标不是函数库文件(Unix下是.a,Windows下是.lib),那么,其值为空。$依赖目标中的第一个目标名字。如果依赖目标是以模式(即%)定义的,那么$将是符合模式的一系列的文件集。注意,其是一个一个取出来的。$?所有比目标新的依赖目标的集合。以空格分隔。$所有的依赖目标的集合。以空格分隔。如果在依赖目标中有多个重复的,那个这个变量会去除重复的依赖目标,只保留一份。例子TARGET=helloworldCC=gccCFLAGS=-Wall -O -gSRC=$(wildcard *.c)OBJS=$(patsubst %.c,%.o,$(w
15、ildcard *.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中的变量替换建立一个简单的makefilesrc=$(wildcard *.c ./sub/*.c)dir=$(notdir $(src)obj=$(patsubst %.c,%.o,$(dir)
16、 ) all: echo $(src) echo $(dir) echo $(obj) echo endMakefile中的变量替换建立一个简单的makefilesrc=$(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 otdir把展开的文件去除掉路径信息 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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024至2030年中国多功能数字逻辑实验仪行业投资前景及策略咨询研究报告
- 2024至2030年麻杏止咳片项目投资价值分析报告
- 2024年中国铜装饰品市场调查研究报告
- 2024年香衣纸项目可行性研究报告
- 2024年中国标准管壳式冷却器市场调查研究报告
- 中国氮掺杂石墨烯行业市场现状分析及竞争格局与投资发展研究报告(2024-2030版)
- 中国比索洛尔产业供需规模与投资价值评价研究报告(2024-2030版)
- 中国对羟基肉桂酸行业应用潜力与投资趋势预测研究报告(2024-2030版)
- 中国双摄像头行车记录仪行业市场现状分析及竞争格局与投资发展研究报告(2024-2030版)
- 中国化学电池市场发展态势与未来前景创新趋势研究报告(2024-2030版)
- 广东省珠海市第十六中学2024-2025学年上学期期中质量监测九年级数学试题(无答案)
- 成语积累竞赛试题
- 2024焊接工艺规程
- 2024年巴黎奥运会
- 人教版(2024)七年级全一册体育与健康第6课《识别界限 拒绝性骚扰》教学设计
- 第六单元(整体教学设计)九年级语文上册大单元教学名师备课系列(统编版)
- 基于区块链的车联网安全研究综述
- 《8 课余生活真丰富》教学设计-2024-2025学年道德与法治一年级上册统编版
- 广州医学院攻读临床医学专业学位研究生培养方案
- 新生儿败血症-7
- MOOC 创业基础-暨南大学 中国大学慕课答案
评论
0/150
提交评论