第3章 linux编程环境.ppt

上传人:qwe****56 文档编号:70015032 上传时间:2023-01-14 格式:PPT 页数:37 大小:231.50KB
返回 下载 相关 举报
第3章 linux编程环境.ppt_第1页
第1页 / 共37页
第3章 linux编程环境.ppt_第2页
第2页 / 共37页
点击查看更多>>
资源描述

《第3章 linux编程环境.ppt》由会员分享,可在线阅读,更多相关《第3章 linux编程环境.ppt(37页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、Linux编程环境主要内容ngcc简介功能命令n利用gcc编译c程序n利用make工具简化编译过程make简介Makefile基本格式n调试静态调试动态调试ngdb调试工具的使用gcc简介n名称:GNU project C and C+Compiler GNU Compiler Collection n管理与维护GNU项目 n对C/C+编译的控制预处理(Preprocessing)编译(Compilation)汇编(Assembly)链接(Linking)gcc的使用n基本使用格式$gcc 选项 n常用选项及含义gcc常用选项选项含义-o file将经过gcc处理过的结果存为文件file,这个

2、结果文件可能是预处理文件、汇编文件、目标文件或者最终的可执行文件。假设被处理的源文件为source.suffix,如果这个选项被省略了,那么生成的可执行文件默认名称为a.out;目标文件默认名为source.o;汇编文件默认名为source.s;生成的预处理文件则发送到标准输出设备。gcc的常用选项gcc常用选项选项含义-c仅对源文件进行编译,不链接生成可执行文件。在对源文件进行查错时,或只需产生目标文件时可以使用该选项。-ggdb在可执行文件中加入调试信息,方便进行程序的调试。如果使用中括号中的选项,表示加入gdb扩展的调试信息,方便使用gdb来进行调试-O0、1、2、3对生成的代码使用优化

3、,中括号中的部分为优化级别,缺省的情况为2级优化,0为不进行优化。注意,采用更高级的优化并不一定得到效率更高的代码。-Dname=definition将名为name的宏定义为definition,如果中括号中的部分缺省,则宏被定义为1gcc的常用选项gcc常用选项选项含义-Idir在编译源程序时增加一个搜索头文件的额外目录dir,即include增加一个搜索的额外目录。-Ldir在编译源文件时增加一个搜索库文件的额外目录dir-llibrary在编译链接文件时增加一个额外的库,库名为library.a-w禁止所有警告-Wwarning允许产生warning类型的警告,warning可以是:ma

4、in、unused等很多取值,最常用是-Wall,表示产生所有警告。如果warning取值为error,其含义是将所有警告作为错误(error),即出现警告就停止编译。gcc文件扩展名规范 ngcc可以根据文件扩展名执行操作gcc文件扩展名规范扩展名类型可进行的操作方式.cc语言源程序预处理、编译、汇编、链接.C,.cc,.cp,.cpp,.c+,.cxxc+语言源程序预处理、编译、汇编、链接.i预处理后的c语言源程序编译、汇编、链接.ii预处理后的c+语言源程序编译、汇编、链接.s预处理后的汇编程序汇编、链接.S未预处理的汇编程序预处理、汇编、链接.h头文件不进行任何操作.o目标文件链接使用

5、gcc编译代码n源代码示例源程序示例源程序hello.c#include int main(void)printf(hello gcc!rn);return 0;生成预处理文件n命令$gcc E hello.c o hello.i预处理文件预处理文件hello.i的部分内容的部分内容.extern void funlockfile(FILE*_stream);#679/usr/include/stdio.h 3#2 hello.c 2int main(void)printf(hello gcc!n);return 0;生成汇编文件n命令$gcc S hello.c o hello.s汇编文件汇

6、编文件hello.s的部分内容的部分内容.main:pushl%ebpmovl%esp,%ebp.addl$16,%espmovl$0,%eaxleaveret.编译多个文件n文件清单greeting.h#ifndef _GREETING_H#define _GREETING_Hvoid greeting(char*name);#endif greeting.c#include#include greeting.hvoid greeting(char*name)printf(Hello%s!rn,name);my_app.c#include#include greeting.h#define

7、N 10int main(void)char nameN;printf(Your Name,Please:);scanf(%s,name);greeting(name);return 0;生成二进制文件n生成目标文件命令:n$gcc c hello.c o hello.on生成可执行文件命令:n$gcc hello.c o hellon运行程序n$./hellohello gcc!编译多个文件n目录结构(1)编译命令n$gcc my_app.c greeting.c o my_appn目录结构(2)编译方式(1)$gcc my_app.c functions/greeting.c o my_a

8、pp -I function greeting.h./greeting.cmy_app.cgreeting.h./greeting.cmy_app.cfunctions编译多个文件n目录结构(2)编译方式(2)n分步编译n命令:1、$gcc -c my_app.c -Ifunctions 2、$gcc -c functions/greeting.c3、$gcc my_app.o greeting.o o my_appn思路:编译每一个.c文件,得到.o的目标文件;将每一个.o的目标文件链接成一个可执行的文件;使用make工具n适用场合:多个文件组成的软件项目n基本格式:n目标:欲生成的目标文件

9、n依赖项:生成目标需要的文件n原理:判断依赖项是否为最新,否则,生成新的目标nmake工具的使用格式:make 命令选项 命令参数通常使用make就可以了,make会寻找Makefile作为编译指导文件;目标:依赖项列表目标:依赖项列表(Tab缩进)命令缩进)命令使用make工具nMakefile示例Makefile文件1 my_app:greeting.o my_app.o2gcc my_app.o greeting.o-o my_app3 greeting.o:functionsgreeting.c functionsgreeting.h4gcc-c functionsgreeting.c

10、5 my_app.o:my_app.c functionsgreeting.h6gcc c my_app.c Ifunctions使用make工具n目标的依赖关系my_appmy_app.ogreeting.omy_app.cfunctionsgreeting.hfunctionsgreeting.cgcc c my_app.c Ifunctions gcc-c functionsgreeting.c gcc my_app.o greeting.o-o my_app 使用make工具n更实用的Makefile更实用的Makefile文件1OBJS=greeting.o my_app.o2CC=

11、gcc3CFLAGS=-Wall-O g4my_app:$OBJS5$CC$OBJS-o my_app6greeting.o:functionsgreeting.c functionsgreeting.h7$CC$CFLAGS-c functionsgreeting.c8my_app.o:my_app.c functionsgreeting.h9$CC$CFLAGS-c my_app.c-Ifunctions调试n调试静态调试:n在程序编译阶段查错并修正错误;n主要为语法错误:输入错误;类型匹配错误;n排错方式:利用错误、警告信息,并结合源文件环境排错动态调试:n在程序运行阶段差错并修正错误;

12、n主要错误类型:算法错误;输入错误;n排错方式:利用调试工具定位并修正错误;调试举例n源文件greeting.h#ifndef _GREETING_H#define _GREETING_Hvoid greeting(char*name);#endif greeting.c#include#include greeting.hvoid greeting(char*name)printf(Hello!rn);my_app.c 1#include 2#include greeting.h3#define N 104 int main(void)5 6 char namen;7 printf(Your

13、 Name,Please:);8 scanf(%s,name)9 greeting(name);10/*return 0;*/11 静态调试举例n分块编译$gcc -g -Wall -c functions/greeting.c-g:将调试信息加入到编译的目标文件中;-Wall:将编译过程中的所有级别的警告都打印出来;n无错误my_$gcc -g -Wall -c my_app.c -Ifunctionsn参数含义同上n错误信息:调试举例n错误信息:错误记录格式:n文件名:行好:错误描述my_app.c:In function main:my_app.c:6:n undeclared(firs

14、t use in this function)my_app.c:6:(Each undeclared identifier is reported only oncemy_app.c:6:for each function it appears in.)my_app.c:9:parse error before greetingmy_app.c:6:warning:unused variable name静态调试举例n分析、定位错误(警告):my_app.c的第6行:n描述含义:n是一个没有声明的变量;n分析:声明数字name时用到了变量n,但变量n在之前没有声明;n改正:声明一个新变量n;或

15、者将n改为宏Nn这里取第2种改正方法;静态调试举例my_app.c的第9行:n描述含义:在“greeting”之前出现解析错误;n分析:c中每行程序以;结束,第9行greeting之前的程序行没有以;结束;n改正:第8行末尾增加“;”n重新编译n错误信息:my_app.c:In function main:my_app.c:11:warning:control reaches end of non-void function静态调试举例n分析、定位错误(警告):警告:my_app.c的11行n描述含义:控制以非空函数结束;n分析:main函数返回类型为int,源程序没有以return 整数形式

16、结束;n改正:将main改为返回void类型;或者:在main程序后增加return 返回语句;采用第2种解决方式;n重新编译,无错误或警告信息,完成静态调试静态调试举例n静态调试总结主要为语法错误:n输入错误;n类型匹配错误;分析信息:n主要来自gcc编译时产生的提示信息错误警告定位:n不一定在提示信息描述的地方;n综合分析提示信息及提示行的上下文环境,定位并修正错误、警告。n有的警告可以不用修复;动态调试举例n 常见的动态调试方法:增加调试语句;记录程序的执行状况;观察内存变化;使用调试工具;nGUN Debuger的功能:启动程序,设置程序执行的上下文环境;在指定的条件下停止程序;程序停

17、止时,检查程序的状态;在程序运行时,改变程序状态,使其按照改变后的状态继续执行。动态调试举例gdb常用的调试命令命令含义file指定需要指定需要进进行行调试调试的程序的程序step单单步(行)步(行)执执行,如果遇到函数会行,如果遇到函数会进进入函数内部入函数内部next单单步(行)步(行)执执行,如果遇到函数不会行,如果遇到函数不会进进入函数内部入函数内部run启启动动被被执执行的程序行的程序quit退出退出gdb调试环调试环境境print查查看看变变量或者表达式的量或者表达式的值值break设设置断点,程序置断点,程序执执行到断点就会行到断点就会暂暂停起来停起来shell执执行其后的行其后

18、的shell命令命令list查查看指定文件或者函数的源代看指定文件或者函数的源代码码,并,并标标出行号出行号动态调试举例n对静态调试中的例子继续进行动态调试n工具:gdbn启动gdb$gdbGNU gdb Red Hat Linux(5.3post-0.20021129.18rh)Copyright 2003 Free Software Foundation,Inc.GDB is free software,covered by the GNU General Public License,and you arewelcome to change it and/or distribute co

19、pies of it under certain conditions.Type show copying to see the conditions.There is absolutely no warranty for GDB.Type show warranty for details.This GDB was configured as i386-redhat-linux-gnu.(gdb)启动命令启动命令启动提示启动提示启动完毕启动完毕动态调试举例n调试指定程序(./my_app)问题:n期望的输出和实际输出不一致(gdb)file./my_appReading symbols fr

20、om./my_app.done(gdb)runStarting program:/home/tom/shell_script/cpp/my_app/my_appYour Name,Please:tomHello!Program exited normally.(gdb)加载调试程序加载调试程序启动调试程序启动调试程序程序输出程序输出提示信息提示信息动态调试举例n初次错误定位:输出有错误n错误定位重新开始一次调试;启动gdb;加载调试程序(./my_app);查看程序源代码n命令:list 文件名动态调试举例n(gdb)list my_app.c:1,20n1#include n2#includ

21、e greeting.hn3#define N 10n4int main(void)n5n6char nameN;n7printf(Your Name,Please:);n8scanf(%s,name);n9greeting(name);n10return 0;n11n(gdb)break 7nBreakPoint 1 at 0 x8048384:file my_app.c,line 7.n在程序第7行设置断点命令:(gdb)break 7查看源代码查看源代码设置断点设置断点提示信息提示信息动态调试举例n错误详细定位1(gdb)run2Starting program:/home/tom/sh

22、ell_script/cpp/my_app/my_app3Breakpoint 1,main()at my_app.c:747printf(Your Name,Please:);5(gdb)next68 scanf(%s,name);7(gdb)next8Your Name,Please:tom99 greeting(name);启动调试程序启动调试程序断点激活断点激活步进下一步步进下一步动态调试举例10(gdb)print name11$1=“tom00000012(gdb)step13greeting(name=0 xbfffdf20“tom”)at functions/greeting.

23、c:5145 printf(”Hello!rn”);15(gdb)step16Hello!176 18(gdb)kill19Kill the programe being debugged?(y or n)y20(gdb)quitn错误详细定位查看变量值查看变量值进入函数内部进入函数内部步进执行步进执行停止调试停止调试退出退出gdb动态调试举例n分析:11行说明name变量被正确赋值(tom)13行说明name变量值被正确赋予greeting的参数变量name16说明打印出现了错误,即错误出现在函数greeting中;n综合分析错误出现在greeting.c的第5行;原因:n没有输出字符串的格式不对;n改正错误动态调试举例n动态调试总结主要错误类型:n算法错误;n输入错误;定位方法:n设置断点;n单步步进执行;n查看变量取值变化;n反复执行,逐步缩小错误范围;课后习题1、从文本源代码到可执行文件,gcc可以对哪些步骤进行控制?2、编一个简单的helloworld程序,利用gcc控制程序生成的四个步骤。3、简述gcc的用法和常用参数的含义。4、上机查找gcc利用的库文件和头文件都放在什么路径下?5、make工具如何使用?Makefile的基本格式是什么?6、简述gdb的用法和常用命令的含义。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com