您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > 第五讲Linux操作系统环境下的C程序开发技术
第五讲Linux操作系统环境下的C程序开发技术Linux系统及程序设计韦勇信息安全教研室7236727@qq.com主要内容•编译器GCC简介•编译器GCC使用•make工具使用•程序调试教学要求•理解GCC概念;•掌握GCC使用方法;•学会编写makefile;•掌握GDB调试方法。GCC简介•名称:–GNUprojectCandC++Compiler–GNUCompilerCollection•管理与维护–GNU项目GCC简介•GCC能工作在多种平台上•Intelx86(Linux,Windows)•Alpha(Linux)•PowerPC(AIX)•Sparc(Solaris)•GCC可以编译多种语言•C•C++•Objective-C(标准C的派生)•Fortran•Java•AdaGCC简介•C语言编译过程–预处理阶段(Preprocess)“#”开头的指令(伪指令/宏指令)和特殊符号进行处理。–编译阶段(Compile)预处理之后的输出文件进行词法分析和语法分析–汇编过程(Assemble)把汇编语言代码翻译成目标机器代码–连接阶段(Link)解决外部符号访问地址问题(库函数)GCC的使用•gcc[选项]输入文件•输入文件包括源程序文件、编译中间文件等•如果没有指定选项,Linux下生成的可执行文件是a.out•gcc的选项主要分为四组:–预处理选项–编译选项–优化选项–连接选项GCC的常用选项gcc常用选项选项含义-ofile将经过gcc处理过的结果存为文件file,这个结果文件可能是预处理文件、汇编文件、目标文件或者最终的可执行文件。假设被处理的源文件为source.c,如果这个选项被省略了,那么生成的可执行文件默认名称为a.out;目标文件默认名为source.o;汇编文件默认名为source.s;生成的预处理文件则发送到标准输出设备。GCC的常用选项gcc常用选项选项含义-c仅对源文件进行编译,不链接生成可执行文件。在对源文件进行查错时,或只需产生目标文件时可以使用该选项。-g[gdb]在可执行文件中加入调试信息,方便进行程序的调试。如果使用中括号中的选项,表示加入gdb扩展的调试信息,方便使用gdb来进行调试-O[0、1、2、3]对生成的代码使用优化,中括号中为优化级别,缺省的情况为2级优化,0为不进行优化。注意,采用更高级的优化并不一定得到效率更高的代码。-Dname[=definition]将名为name的宏定义为definition,如果中括号中的部分缺省,则宏被定义为1GCC的常用选项gcc常用选项选项含义-Idir在编译源程序时增加一个搜索头文件的额外目录——dir,即include增加一个搜索的额外目录。-Ldir在编译源文件时增加一个搜索库文件的额外目录——dir-llibrary在编译链接文件时增加一个额外的库,库名为library.a-w禁止所有警告-Wwarning允许产生warning类型的警告,warning可以是:main、unused等很多取值,最常用是-Wall,表示产生所有警告。如果warning取值为error,其含义是将所有警告作为错误(error),即出现警告就停止编译。GCC文件扩展名规范gcc文件扩展名规范扩展名类型可进行的操作方式.cc语言源程序预处理、编译、汇编、链接.C,.cc,.cp,.cpp,.c++,.cxxc++语言源程序预处理、编译、汇编、链接.i预处理后的c语言源程序编译、汇编、链接.ii预处理后的c++语言源程序编译、汇编、链接.s预处理后的汇编程序汇编、链接.S未预处理的汇编程序预处理、汇编、链接.h头文件不进行任何操作.o目标文件链接使用gcc编译代码•源代码示例源程序——hello.c#includestdio.hintmain(void){printf(hellogcc!\r\n);return0;}生成预处理文件•$gcc–Ehello.c–ohello.i预处理文件hello.i的部分内容......externvoidfunlockfile(FILE*__stream);#679/usr/include/stdio.h3#2hello.c2intmain(void){printf(hellogcc!\n);return0;}生成汇编文件•$gcc–Shello.c–ohello.s汇编文件hello.s的部分内容......main:pushl%ebpmovl%esp,%ebp........addl$16,%espmovl$0,%eaxleaveret......生成二进制文件•生成目标文件–命令:•$gcc–chello.c–ohello.o•生成可执行文件–命令:•$gcchello.c–ohello•运行程序•$./hellohellogcc!编译多个文件greeting.h#ifndef_GREETING_H#define_GREETING_Hvoidgreeting(char*name);#endifgreeting.c#includestdio.h#includegreeting.hvoidgreeting(char*name){printf(Hello%s!\r\n,name);}my_app.c#includestdio.h#includegreeting.h#defineN10intmain(void){charname[N];printf(YourName,Please:);scanf(%s,name);greeting(name);return0;}编译多个文件•目录结构(1)–编译命令•$gccmy_app.cgreeting.c–omy_app•目录结构(2)–编译方式(1)$gccmy_app.cfunctions/greeting.c–omy_app-Ifunctionsgreeting.h./greeting.cmy_app.cgreeting.h./greeting.cmy_app.cfunctions编译多个文件•目录结构(2)–编译方式(2)•分步编译•命令:–1、$gcc-cmy_app.c-Ifunctions–2、$gcc-cfunctions/greeting.c–3、$gccmy_app.ogreeting.o–omy_app•思路:–编译每一个.c文件,得到.o的目标文件;–将每一个.o的目标文件链接成一个可执行的文件;使用make工具•适用场合:–多个文件组成的软件项目•基本格式:•目标:欲生成的目标文件•依赖项:生成目标需要的文件•原理:–判断依赖项是否为最新,否则,生成新的目标目标:依赖项列表(Tab缩进)命令使用make工具•make工具的使用格式:–make[[命令选项][命令参数]]–通常使用make就可以了,make会寻找Makefile作为编译指导文件;使用make工具•Makefile示例Makefile文件1my_app:greeting.omy_app.o2gccmy_app.ogreeting.o-omy_app3greeting.o:functions/greeting.cfunctions/greeting.h4gcc-cfunctions/greeting.c5my_app.o:my_app.cfunctions/greeting.h6gcc–cmy_app.c–Ifunctions使用make工具•目标的依赖关系my_appmy_app.ogreeting.omy_app.cfunctions/greeting.hfunctions/greeting.cgcc–cmy_app.c–Ifunctionsgcc-cfunctions/greeting.cgccmy_app.ogreeting.o-omy_app使用make工具更实用的Makefile文件1OBJS=greeting.omy_app.o2CC=gcc3CFLAGS=-Wall-O–g4my_app:${OBJS}5${CC}${OBJS}-omy_app6greeting.o:functions/greeting.cfunctions/greeting.h7${CC}${CFLAGS}-cfunctions/greeting.c8my_app.o:my_app.cfunctions/greeting.h9${CC}${CFLAGS}-cmy_app.c-Ifunctions•target:$OBJgcc……-otargetclean:rm……install:……remove:……Makefile实例调试•静态调试•在程序编译阶段查错并修正错误;•主要为语法错误:–输入错误;–类型匹配错误;•排错方式:–利用错误、警告信息,并结合源文件环境排错静态调试举例•动态调试:•在程序运行阶段差错并修正错误;•主要错误类型:–算法错误;–输入错误;•排错方式:–利用调试工具定位并修正错误;静态调试举例greeting.h#ifndef_GREETING_H#define_GREETING_Hvoidgreeting(char*name);#endifgreeting.c#includestdio.h#includegreeting.hvoidgreeting(char*name){printf(Hello!\r\n);}my_app.c1#includestdio.h2#includegreeting.h3#defineN104intmain(void)5{6charname[n];7printf(YourName,Please:);8scanf(%s,name)9greeting(name);10/*return0;*/11}静态调试举例•分块编译–greeting.c•$gcc-g-Wall-cfunctions/greeting.c-g:将调试信息加入到编译的目标文件中;-Wall:将编译过程中的所有级别的警告都打印出来;•无错误–my_app.c•$gcc-g-Wall-cmy_app.c-Ifunctions•参数含义同上•错误信息:静态调试举例•错误信息:–错误记录格式:•文件名:行号:错误描述my_app.c:Infunction`main':my_app.c:6:`n'undeclared(firstuseinthisfunction)my_app.c:6:(Eachundeclaredidentifierisreportedonlyoncemy_app.c:6:foreachfunctionitappearsin.)my_app.c:9:parseerrorbeforegreetingmy_app.c:6:warning:unusedvariable`name'静态调试举例•分析、定位错误(警告):–my_app.c的第6行:•描述含义:–n是一个没有声明的变量;•分析:–声明数字name时用到了变量n,但变量n在之前没有声明;•改正:–声明一个新变量n;或者–将n改为宏N•这里取第2种改正方法;静态调试举例–my_app.c的第9行:•描述含义:–在“greeting”之前出现解析错误;•分析:–c中每行程序以;结束,第9行greeting之前的程序行没有以;结束;•改正:–第8行末尾增加“;”•重新编译•错误信息:my_app.c:Infunction`main':my_app.c:11:warning:controlreachesendofnon-voidfunction静态调试举例•分析、定位错误(警告):–警告:my_app.c的11行•描述含义:控制以非空函数结束;•分析:main函数返回类型为int,源程序没有以return整数形式结束;•改正:–将main改为返回void类型;或者:–在main程序后增加return返回语句;–采用第2种解决方式;•重新编译,无错误或警告信息,完成静态调试静态调试举例•静态调试总结–主要为语法错
本文标题:第五讲Linux操作系统环境下的C程序开发技术
链接地址:https://www.777doc.com/doc-2085412 .html