版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章GNUC开发环境内容提要GNUC编译器项目管理工具:GNUmake创建和使用函数库GNUC函数库:glibc5.1GNUC编译器概述GNU计划开发了一系列编译器,他们构成GNU编译器集合GCC。用高级语言编写的源代码文件需要依次经过预处理、编译和链接,最终生成各种目标文件,例如,可执行文件等。为了提高软件的开发效率,开发人员引入了一系列工具,例如,调试器、项目管理和版本控制等软件。
本章围绕Linux环境下的C语言开发,对开发过程中所涉及的主要工具进行介绍。编译与链接LibraryFilesObjectFilesAssemblySourceFilesC/C++SourceandHeaderFilesMakefile工程文件c/c++源文件(*.c/*.cpp)和头文件(*.h)汇编语言源文件(*.s)链接命令文件用户创建的文件预处理(cpp)编译器(gcc/g++)汇编器(as)Make工具目标文件(*.o)共享目标文件可执行文件可链接文件链接映射文件链接器(ld)函数库文件(*.a/*.so)归档工具(ar)基本概念1.预处理预处理是指处理源代码文件中以#为行首的指令,例如,宏定义和条件编译等,将其转换为等价源文件。2.编译编译是指源代码文件翻译成机器指令,内容包括词法分析、语法分析、中间代码的生成与优化。基本概念(续)3.汇编汇编是指将汇编语言转换为机器指令的过程。4.链接链接是指在链接命令文件的控制下,链接器将目标文件和引用的函数库组合为可执行文件的过程。GCCGCC(GNUCompilerCollection)是GNU下编译器及其相关工具的集合。GCC原名为GNUC语言编译器,因为它原本只能处理C语言。随着GCC的发展,在功能上得到了不断扩展。目前,支持多种语言,被移植到多种硬件处理器,适用于多种操作系统。gcc命令
gcc(GNUCCompiler)是GNU下C语言编译器及相关工具的集成,其中包含了预处理器、编译器、汇编器、链接器等工具。gcc命令语法gcc[option]list功能编译/链接列表list中的C源文件。gcc命令(续)选项功能描述-Wall打印警告信息-g生成调试信息-O0-O1-O2(O大写)优化选项,若有多个则最后一个有效-I(i大写)指定额外头文件搜索路径-L指定额外函数库的搜索路径-D定义宏-l指定引用函数库的名称-static指定链接时使用静态库-shared指定链接时使用共享库(默认)-E输出预处理后的文件-S(S大写)编译生成的汇编文件(.s)-c编译并汇编生成的目标文件(.o)-o指定输出文件名-Wl告诉gcc/g++传送参数至linker-fpic生成地址无关代码-M-MM生成目标依赖关系,-MM不包含系统头文件实例分析//exam5-1.c#include<stdio.h>intcount=20;int
main(void){
intk;
intsum=0;
#ifdefDEBUG
printf("runingindebugmode\n");#else
printf("runinginnodebugmode\n");#endif
for(k=0;k<count;k++)sum=sum+k;
printf("thesumis%d\n",sum);}实例分析(续)$gcc-E-DDEBUGexam5-1.c-oexam5-1.i //预处理生成exam5-1.i$gcc-Sexam5-1.i//编译生成exam5-1.s$gcc-cexam5-1.s//汇编生成exam5-1.o$gccexam5-1.o-oexam5-1//链接生成exam5-1$exam5-1//观察程序运行结果runingindebugmodethesumis: 190将各阶段合成一条命令$gcc-DDEBUGexam5-1.c-oexam5-15.2项目管理工具GNUmake内容提要GNUmake概述编写GNUmake脚本规则 变量隐含规则和模式规则实例分析GNUmake概述GNUmake是一种Linux环境下软件项目管理工具,通过编写脚本,以规则的形式明确目标的生成过程,当需生成某个目标时,仅需携带目标参数的make命令即可,make便会根据脚本中的规则,以最小代价自动生成目标。
GNUmake适用于有一定规模的软件项目,实现目标生成的管理,为了增强规则脚本的表达能力,GNUmake引入高级语言的某些语法成分,例如变量和函数等。存放make执行规则的脚本文件通常默认为Makefile或makefile。实例分析
假设一小型系统经过分析与设计,系统按功能被划分为若干模块,模块对应的源文件分别为app.c、main.c、frame.c、component.c和lib.c,最终需生成可执行文件app。手工管理$gcc-capp.c
$gcc-cmain.c
$gcc-cframe.c
$gcc-ccomponent.c
$gcc-clib.c
$gcc
app.o
main.o
frame.o
component.o
lib.o-oappshell脚本$catexam.shgcc-capp.c
gcc-cmain.c
gcc-cframe.c
gcc-ccomponent.c
gcc-clib.c
gcc
app.o
main.o
frame.o
component.o
lib.o-oapp规则
Makefile通常由若干条规则组成,每条规则的语法如下。语法目标:依赖文件<tab>[修饰符]命令1<tab>[修饰符]命令2……<tab>[修饰符]命令n
规则描述目标产生的条件和过程,它由依赖关系和动作两部分组成,依赖关系描述生成目标需依赖的对象,动作描述目标生成需执行的命令。规则(续)
命令行以<tab>字符开始,目标由若干以空格分割的文件名或标签组成,通常目标仅包含一个文件名或标签;依赖文件是目标生成所依赖的文件,它由若干以空格分割的文件名构成;命令前的修饰符为可选项,用于对命令执行过程的修饰。重建目标需满足下列条件之一。(1)目标文件不存在。(2)目标的修改时间早于依赖路径上某文件的修改时间。依赖文件中的文件通常为另一条规则的目标,依赖文件可为空。规则的执行
建立目标时,make从规则推导出产生目标的路径,当条件满足,make以反向递推方式依次生成依赖的目标,直至产生最终目标。若目标的修改时间晚于所依赖的文件,则对应规则中的命令不予执行,以提高项目管理效率。Makefile文件app:app.o
main.o
frame.o
component.o
lib.o
gcc
app.o
main.o
frame.o
component.o
lib.o-oappapp.o:app.c
gcc-capp.cmain.o:main.c
gcc-cmain.cframe.o:frame.c
gcc-cframe.ccomponent.o:component.c
gcc-ccomponentlib.o:lib.c
gcc-clib.cclean:
rm-rf*.o递归生成目标appmain.oframe.ocomponent.olib.ogccapp.omain.oframe.ocomponent.olib.o-oappmakeappapp.omain.cframe.ccomponent.clib.capp.cgcc-capp.cgcc-cmain.cgcc-ccomponent.cgcc-clib.cgcc-cframe.cGNUmake的变量
为了提高可扩展性,使规则更简洁,make引入变量、函数和模式等高级特性;变量可保存文件名列表、命令和参数。
make支持四种类型的变量,它们分别1.自定义变量2.环境变量3.预定义变量4.自动变量。自定义变量(1)变量的赋值自定义变量存在多种赋值方式,常见的赋值操作如下表所示。变量赋值操作含义name=string以递归展开方式为变量name赋值,string中引用的变量在使用时展开name:=string以直接展开方式为变量name赋值,string中引用的变量在定义时展开name+=string为变量name添加新值name?=string为未定义的变量name赋值(2)变量的引用$(name)或${name}环境变量make会继承父进程Shell的环境变量,系统中的环境变量对make可见,此外,用户可在脚本中使用export/unexport创建/注销环境变量,环境变量的引用方法与自定义变量相同;由于环境变量的全局性,应尽量避免使用,尤其对于递归式make。预定义变量
为了提高脚本的可读性和可移植性,make引入了预定义变量,并为它们设置默认值,在实际应用时,预定义变量可被重新赋值,make中常见的预定义变量如下表所示。预定义变量名含义默认值AR归档程序arAS汇编器asCCC语言编译器ccCXXC++编译器g++CPP带有标准输出的C语言预处理程序$(CC)–ERM删除文件的命令rm–rVPATH依赖文件的搜索路径空自动变量
对于模式规则,依赖关系中不指定具体的目标和依赖的文件,模式中的对象只有在规则解释时才能确定。为了满足这些需求,GNUmake引入了自动变量,其定义如下表所示。变量功能描述$^规则中所有的依赖文件,文件以空格分割,以出现的先后为序$<规则中的第一个依赖文件$?所有比目标文件更新的依赖文件,文件以空格分割$*目标模式中%及其之前的部分$@规则中的目标隐含规则和模式规则
对于规模较大的软件,项目管理脚本通常拥有大量的规则,其中很多规则具有相似性,为了简化设计,提高脚本的可读性,make引入了隐含规则和模式规则。隐含规则
隐含规则亦称内置规则,为make内部的预定义规则。在实际应用中,有些规则频繁出现且具有相似的行为模式,例如,将后缀.c的C源文件编译为后缀.o的中间文件等%.o:%.c $(COMPILE.c)$(OUTPUT_OPTION)$<
为了简化脚本设计,make以模式规则的方式预先进行了定义,用户无须在脚本中显式定义。模式规则
若规则的依赖关系中使用了通配符%,这样的规则称为模式规则;例如,模式d%.c表示以字母d开头的任意C源文件;通常,隐含规则属于模式规则。Makefile文件objs=app.o
main.o
frame.o
component.o
lib.o
app:$(objs) $(CC)-o$@$^clean:
rm-f*.o
通过使用变量、隐含规则和模式规则,可使脚本的内容更简洁。5.3创建和使用函数库内容提要函数库概述静态库共享库动态链接器函数库概述
在软件开发过程中,为了提高代码的可复用性,对于可重复使用的代码,可将它们组织成函数库,以函数库的形式供其他开发人员使用,从而提高软件的开发效率。函数库是由若干函数构成的集合,由源代码经编译后归档产生,根据函数库的使用方式,函数库可分为静态库和共享库。通常,同一份代码会以静态库和共享库两种形式供用户使用,它们在功能上并无区别。函数库的链接方式使用静态函数库链接生成的可执行文件使用共享函数库链接生成的可执行文件静态函数库共享函数库静态函数库文件命名:libxxx.a共享韩束库文件命名:libxxx.so嵌入目标对象动态加载目标对象静态库
静态库由若干源代码经编译器产生的目标文件,利用ar工具归档而成。静态库的命名方式为libxxx.a,lib为前缀,xxx为库名,.a为后缀。静态库的特点
使用静态库链接生成的可执行文件具有下列特点。(1)运行时无须静态库的支持。(2)较高的运行速度(3)占用较多内存和磁盘空间(4)不易维护创建和使用静态库1.创建静态库将源代码文件exam5-2.c和exam5-3.c编译并归档为静态库libdemo.a。$gcc-c-Wallexam5-2.c$gcc-c-Wallexam5-3.c$ar-crulibdemo.aexam5-2.oexam5-3.o2.使用静态库$gcc-I.exam5-5.c-oexam5-5libdemo.a或$gcc-I.-L.exam5-5.c-oexam5-5-ldemo
共享库
共享库由若干源代码文件经过编译生成地址无关的目标文件,由链接器链接而成。由于共享库的运行地址需在加载时确定,因此,共享库也称为动态链接库。共享库的命名方式为libxxx.so,lib为前缀,xxx为库名,.so为后缀。共享库的特点
使用共享库链接生成的可执行程序具有下列特点。(1)占用较少的内存和磁盘空间。(2)多个实例仅需保留一个共享对象的内存副本。(3)容易维护(14)程序运行时需要共享库的支持。(5)程序启动速度较慢。创建和使用共享库1.创建共享库将源代码文件exam5-2.c和exam5-3.c编译并链接为共享库libdemo.so$gcc–c-fpic-Wallexam5-2.c$gcc–c-fpic-Wallexam5-3.c$gcc-shared-olibdemo.soexam5-2.oexam5-3.o2.使用共享库$gcc-I.exam5-5.c-oexam5-5libdemo.so或$gcc-I.-L.exam5-5.c-oexam5-5-ldemo
共享库别名
为了便于共享库的维护,在创建共享库时,可为其定义一个别名,提供一层间接引用,供动态链接器使用。为共享库创建别名时,需用别名为真实共享库文件创建一个符号链接。
创建共享库别名
为共享库libdemo.so.2.3添加别名libdemo.so.2。$gcc-Wall-fpic-sharedexam5-2.cexam5-3.c-olibdemo.so.2.3-Wl,--soname,libdemo.so.2
为别名创建符号链接,共动态哦连接器使用。$ln-slibdemo.so.2.3libdemo.so.2
为便于链接,为别名进一步创建符号链接,供链接时使用。$ln-slibdemo.so.2libdemo.so
动态链接器
对于使用共享库链接生成的可执行文件,由于共享库的运行地址尚未确定,因此,在程序加载时需进行重定位,系统通常将该工作交由一个称为动态链接器的程序完成。它本身也是可执行文件,位于/lib/ld-linux.so.X,X为版本号。共享库中对象的运行地址,由动态链接器在加载时确定。共享库的搜索
加载共享库时,为了使动态链接器确定其所在位置,系统需为动态链接器设置搜索路径,搜索路径的优先级如下。
(1)若设置了环境变量LD_LIBRARY_PATH,装载器依次搜索其中的目录。(2)若生成程序时使用了-rpath选项,则查找指定的目录。(3)检查/etc/ld.so.cache文件,确认其中是否包含所需的共享库。(4)检查/lib和/usr/lib目录。5.4GNUC函数库:glibc内容提要glibc概述glibc的体系架构glibc函数的分类glibc函数的返回值构建应用程序实例分析glibc概述
glibc(BNUCLibrary)是GNU为Linux系统设计,面向C语言的标准函数库,自诞生至今,处于不断演化过程中,其功能日趋完善。
glibc函数库封装了Linux内核的硬件特性,支持ISOC,SVID,POSIX.,BSD,和SUS等多种接口标准,使基于glibc开发的应用程序,在无需修改源码的前提下,可跨越不同的操作系统和硬件平台,从而提高了应用程序的可移植性。
glibc提供了大量可复用函数,降低了软件开发成本,提高了软件开发效率。glibc的安装路径头文件/usr/include//系统头文件/usr/local/include//本地头文件函数库/lib:/系统必备共享库/usr/lib/标准静态库和共享库/usr/X11R6/lib//X11R6的函数库/usr/local/lib//本地函数库glibc的体系架构sys_read()….fork(){...
movl2,%eax
int$0x80...}IDT0x0用户空间main(){...fork()...}ENTRY(system_call){
SAVE_ALL...
call*SYMBOL_NAME(sys_call_table)(,%eax,4)...
ret_from_sys_call();}
sys_call_table1234
sys_fork(){ ...}内核空间应用程序sys_write()divide_error()debug()nmi()system_call()0x80glibcsys_fork()sys_exit()glibc函数的分类核心函数仅对内核接口进行了简单封装,语义未发生改变,与内核接口一一对应。例如,open函数和execve函数等库函数库函数可进一步分为衍生函数和辅助函数,衍生函数在核心函数的基础上,对功能做了进一步扩展,例如,glibc的标准I/O函数库,辅助函数与内核无关,例如,数学函数和字符串函数等。glibc函数的返回值
函数调用通常会有一个返回值,返回0表示成功,返回-1表
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高中地理必修•第1册期中试卷及答案-中图版-2024-2025学年
- 软件设计师(基础知识、应用技术)合卷软件资格考试(中级)试题与参考答案
- 酒店委托经营合同
- 个人装修合同样本
- 测试岗位招聘面试题与参考回答(某大型集团公司)
- 2024年度电子商务行业竞争调查与分析合同3篇
- 二零二四年文化交流与合作合同
- 2024年二手房屋按揭贷款还款合同2篇
- 2024版工程勘察合同书2篇
- 2024房产交易定金支付方式合同3篇
- 医药代表培训完整教程
- GB/T 44713-2024节地生态安葬服务指南
- 《可持续发展新理念》课件
- 玻璃生产车间改造方案
- 一年级家长会课件2024-2025学年
- 《扣件式钢管脚手架安全技术规范》JGJ130-2023
- 欠薪清零台账
- 消防维保年度总结范文(2篇)精选范文
- 天津科技大学 大学物理(下)本科试卷(A卷)(含答案)
- 消防应急组织架构图
- 锅炉安装工程—质量证明书(散装)
评论
0/150
提交评论