linux下的C程序编程

上传人:人*** 文档编号:567504202 上传时间:2024-07-20 格式:PPT 页数:29 大小:807KB
返回 下载 相关 举报
linux下的C程序编程_第1页
第1页 / 共29页
linux下的C程序编程_第2页
第2页 / 共29页
linux下的C程序编程_第3页
第3页 / 共29页
linux下的C程序编程_第4页
第4页 / 共29页
linux下的C程序编程_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《linux下的C程序编程》由会员分享,可在线阅读,更多相关《linux下的C程序编程(29页珍藏版)》请在金锄头文库上搜索。

1、1 1Linux下的下的C程序编程程序编程2 2主要内容GCC编译器编译器GDB调试器调试器3 3一、一、GCC编译器编译器 1、GCC是什么是什么GCC(GNU C Complier)是符合)是符合ANSI C标准标准的多平台编译器。的多平台编译器。GCC通过后缀来区别输入文件通过后缀来区别输入文件的类型,集成的类型,集成C、C+、JAVA等多种语言编译器。等多种语言编译器。cC语言源代码文件。语言源代码文件。h程序所包含的头文件。程序所包含的头文件。o编译后的目标文件。编译后的目标文件。i 已经预处理过的已经预处理过的C源代码文件。源代码文件。s汇编语言源代码文件。汇编语言源代码文件。S经

2、过预编译的汇编语言源代码文件。经过预编译的汇编语言源代码文件。C、cpp、.cc或或.cxx C+源代码文件。源代码文件。ii己经预处理过的己经预处理过的C+源代码文件。源代码文件。a由目标文件构成的档案库文件。由目标文件构成的档案库文件。通过文件后缀来判断文件类型,通过权限来判断文件是否可以运行通过文件后缀来判断文件类型,通过权限来判断文件是否可以运行4 42、GCC工作流程工作流程 如图所示。如图所示。预处理预处理编译编译汇编汇编链接链接得得到到*.s得得到到*.o源程序源程序*.c预处理器预处理器cpp编译器编译器egcs汇编器汇编器as链接器链接器ld可执行文件可执行文件得到得到得到得

3、到*.i5 5起步演示起步演示helloworldhello.c#includeintmain(void)printf(“helloworld!n”);return0;编译运行这段程序:编译运行这段程序:gcchello.cohello./hello输出:输出:helloworld!6 63、基本使用、基本使用基本用法:基本用法: gcc options filenames options:编译器所需要的编译选项编译器所需要的编译选项 filename:要编译的文件名:要编译的文件名 GCC有超过有超过100个的编译选项。选项的合理使用对个的编译选项。选项的合理使用对编译调试程序有很大作用。只

4、介绍其中最基本、最编译调试程序有很大作用。只介绍其中最基本、最常用的参数常用的参数u-o output_filename:确定可执行文件的名称为确定可执行文件的名称为output_filename.如果不给出这个选项,如果不给出这个选项,gcc就给就给出预设的可执行文件出预设的可执行文件a.out7 7u-c进行预处理、编译,产生目标代码,不连接成为进行预处理、编译,产生目标代码,不连接成为可执行文件。编译器只是由输入的可执行文件。编译器只是由输入的.c等源代码文件生等源代码文件生成成.o为后缀的的文件(一般应用程序开发用不到,内为后缀的的文件(一般应用程序开发用不到,内核开发中可以用到)核开

5、发中可以用到)u-g产生符号调试工具产生符号调试工具(GNU的的GDB)所必要的符号信息,所必要的符号信息,要想对源代码进行调试,必须加入这个选项。要想对源代码进行调试,必须加入这个选项。u-O告诉告诉gcc进行基本优化,整个源代码会在编进行基本优化,整个源代码会在编译、连接过程中进行优化处理译、连接过程中进行优化处理u-O2产生尽可能小、快的代码,比产生尽可能小、快的代码,比-O跟好的优跟好的优化编译、连接化编译、连接8 8#includeintmain(void)doublecounter;doubleresult;doubletemp;for(counter=0;counter2000.

6、0*2000.0*2000.0/20.0+2020;counter+=(5-1)/4)temp=counter/1979;result=counter;printf(“resultis%lfn”,result);return0;9 9gccoptimize.cooptimizetime./optimizegccOoptimize.cooptimizetime./optimize对比两次执行的输出结果不难看出,程序的对比两次执行的输出结果不难看出,程序的性能的确的到了很大幅度的改善性能的确的到了很大幅度的改善1010u-w关闭所有警告关闭所有警告,建议不要使用此项建议不要使用此项u-Wall允许

7、发出允许发出gcc能提供的所有有用的警告能提供的所有有用的警告,也可以用也可以用-W(warning)来标记指定的警告来标记指定的警告1111-E只进行预处理,结果输出到标准输出,除非用只进行预处理,结果输出到标准输出,除非用-o指定输出指定输出文件(一般指定文件后缀为文件(一般指定文件后缀为.i)-S进行预处理、编译,产生汇编代码。输出的文件后缀默认进行预处理、编译,产生汇编代码。输出的文件后缀默认为为.s。-I dirname指定额外的头文件搜索路径指定额外的头文件搜索路径dirname目录目录-L dirname指定额外的函数库搜索路径指定额外的函数库搜索路径dirname目录。目录。1

8、212多个文件的编译多个文件的编译vi main.c#include void chessboard();void stair();main() chessboard(); stair();vi chessboard.c#include void chessboard() int i,j; for (i=0;i8;i+) for(j=0;j8;j+) if(i+j)%2=0) printf(%c%c,0xa1,0xf6); else printf( ); printf(n); printf(n);vistair.c#includevoidstair()inti,j;for(i=1;i11;i+

9、)for(j=1;j=i;j+)printf(%c%c,0xa1,0xf6);printf(n);printf(n);gccmain.cchessboard.cstair.coprngrap1313常见错误常见错误语法错误:语法错误:错误信息:文件错误信息:文件source.c中第中第 n 行有语法错误(行有语法错误(syntex error)。)。头文件错误头文件错误错误信息:找不到头文件错误信息:找不到头文件head.h ( can not find include file head.h)。)。函数库错误函数库错误错误信息:链接程序找不到所需的函数库。如:错误信息:链接程序找不到所需的函

10、数库。如:ld:-lm:No such file or directory1414二、二、GDB调试器调试器1、GDB介绍介绍GDB调试器主要用于调试调试器主要用于调试可执行文件可执行文件,这个文件,这个文件必须提供调试版本,必须提供调试版本,包含调试信息包含调试信息。所以,编译程序时一定用调试选项使生成的可执行文件所以,编译程序时一定用调试选项使生成的可执行文件内包含调试信息,常用内包含调试信息,常用-g。调试信息包含程序里每个变量的类型和在可执行文件里调试信息包含程序里每个变量的类型和在可执行文件里的地址映射及行号。的地址映射及行号。主要功能:主要功能:监视程序中变量的值监视程序中变量的值

11、设置断点设置断点逐行执行代码逐行执行代码1515起步调试起步调试test.cvoidmain()inti;longresult=0;for(i=1;i=100;i+)result+=i;printf(result=%dn,result);1616GDB快速进阶快速进阶1、编译生成可执行文件、编译生成可执行文件gccgtest.cotest2、启动、启动GDBgdbtest3、在、在main函数处设置断点函数处设置断点breakmain4、运行、运行run5、单步运行、单步运行next6、继续运行、继续运行continue17172、启动、启动GDB1)gdb调试程序名调试程序名举例:举例:gd

12、bhelloworld2)gdbfile调试程序名调试程序名18183、GDB基本命令基本命令list(l)查看程序查看程序break(b)函数名函数名在函数入口处设置断点在函数入口处设置断点break(b)行号行号在指定行添加断点在指定行添加断点break(b)文件名:文件名:行号行号在制定文件名的制定行在制定文件名的制定行添加断点添加断点1919命 令简 写功 能helph查看看GDB命令的帮助信息命令的帮助信息file装入需要装入需要调试的可的可执行文件行文件killk终止正在止正在调试的程序的程序listl列出列出产生生执行文件的源代行文件的源代码的一部分的一部分nextn执行一行源代

13、行一行源代码但不但不进入函数内部入函数内部steps执行一行源代行一行源代码且且进入函数内部入函数内部continuec继续执行程序,直至下一中断或者程序行程序,直至下一中断或者程序结束束runr执行当前被行当前被调试的程序的程序quitq终止止GDBwatch使你能使你能监视一个一个变量的量的值而不管它何而不管它何时被改被改变catch布置捕捉点布置捕捉点threadt查看当前运行程序的看当前运行程序的线程信息程信息breakb在代在代码中中设置断点,置断点,这将使程序将使程序执行到行到这里里时被挂起被挂起make不退出不退出GDB而重新而重新产生可生可执行文件行文件shell使你能不离开使

14、你能不离开GDB就就执行行Shell命令命令printp打印数据内容打印数据内容backtracebt查看函数看函数调用用栈的所有信息的所有信息20202、使用举例:调试一个计算150和1100累加值的程序。初始源代码的输入初始源代码的输入编译带调试信息的可执行文件编译带调试信息的可执行文件启动启动GDBGDB开始调试开始调试运用运用GDBGDB命令,分析源代码执行命令,分析源代码执行退出退出GDBGDB用用vivi修改调试中发现的源代码错误修改调试中发现的源代码错误2121(1)vitst.c,打开打开vi编辑器,编辑编辑器,编辑tst.c源程序文件源程序文件#includeintsum(i

15、ntn);main()inti,result=0;for(i=1;i=50;i+)result+=i;printf(result1-50=%dn,result);printf(result1-100=%dn,sum(100);intsum(intn)inti,sum;for(i=1;i=n;i+)sum+=i;returnsum;2222(2)编译)编译tst.c并运行并运行tst程序程序编译:编译:gcc tst.c o tst运行:运行:./tstgcc编译时无报错,表明编译通过。但运行编译时无报错,表明编译通过。但运行tst时,第一行结果时,第一行结果result1-50=1275是正确

16、的,第二是正确的,第二行结果行结果result1-100=14160814与预想不符与预想不符2323(3)调试)调试1.输入命令:输入命令:gcc -g tst.c -o tst2.启动调试:启动调试:gdb tst在在gdb下进行调试过程用到许多基本下进行调试过程用到许多基本gdb命令,一命令,一般都只写首字母即可。般都只写首字母即可。键入键入“l”(list)查看)查看gdb载入文件载入文件tstsm的源代的源代码。按回车则重复上一次操作。码。按回车则重复上一次操作。查看文件按回车键按回车键程序的关程序的关键断点。键断点。2424在第在第18行设置断点行设置断点键入键入”infob”查看

17、设置断点的情况;输入命令查看设置断点的情况;输入命令“d断点号断点号”删除(删除(delete)断点)断点GDB中键入中键入“r”(run),程序从首行运行到断点前一句,在断点处暂停。),程序从首行运行到断点前一句,在断点处暂停。 2525在在GDB中键入中键入“p(print)变量名变量名”命令查看断点处的相关变量值命令查看断点处的相关变量值在在gdb中输入命令中输入命令“n”(next),采用单步运行方式继续往下执行程序),采用单步运行方式继续往下执行程序在在gdb中输入命令中输入命令“c”(continue)把剩余还未执行的程序执行完)把剩余还未执行的程序执行完键入键入“q”(quit)

18、,退出),退出GDB调试,返回终端的系统提示符。调试,返回终端的系统提示符。本例子错误在本例子错误在sumsum函数中未对函数中未对sumsum变量初始化。变量初始化。2626关于关于watch 变量变量注意,注意,watch设置的观察点当值有改变时才会有输出。设置的观察点当值有改变时才会有输出。有时对断点的变量设置了观察点,但是有时对断点的变量设置了观察点,但是c(continue),),n(ext)使用的不适当会看不到变量值的变化效果。)使用的不适当会看不到变量值的变化效果。某个求字符串反序的程序中的一段代码某个求字符串反序的程序中的一段代码for(i=0;isize;i+)str2siz

19、e-i=str1i;(a)str2size+1=0;(b)gdb调试时,在调试时,在a处设置断点,处设置断点,run后停在后停在a处,设置对处,设置对变量的观察点变量的观察点watch str2size-i。然后按。然后按n一步步执行,看不一步步执行,看不到值的变化,到值的变化,按按c才能看到效果才能看到效果。27274、GDB的的help命令命令1.直接输入直接输入help,可查看,可查看到到GDB命令种类命令种类2.查看某个类中的各种查看某个类中的各种命令。如上步中列出命令。如上步中列出的种类的种类data3.查看某个命令查看某个命令(gdb)helpListofclassesofcomm

20、ands:aliases-Aliasesofothercommandsbreakpoints-Makingprogramstopatcertainpointsdata-Examiningdatafiles-Specifyingandexaminingfilesinternals-MaintenancecommandsTypehelpfollowedbyaclassnameforalistofcommandsinthatclass.Typehelpfollowedbycommandnameforfulldocumentation.CommandnameabbreViationsareallowe

21、difunambiguous.(gdb)helpdataExaminingdata.Listofcommands:call-Callafunctionintheprogramdeletedisplay-Cancelsomeexpressionstobedisplayedwhenprogramstopsdeletemem-Deletememoryregiondisabledisplay-DisablesomeexpressionstobedisplayedwhenprogramstopsTypehelpfollowedbycommandnameforfulldocumentation.Comma

22、ndnameabbreViationsareallowedifunambiguous.查找查找call命令:命令:helpcall。(gdb)helpcallCallafunctionintheprogram.Theargumentisthefunctionnameandarguments,inthenotationofthecurrentworkinglanguage.Theresultisprintedandsavedinthevaluehistory,ifitisnotvoid.2828实验几个简单实验几个简单C程序。程序。课本及实验教材中陆续会出现各种课本及实验教材中陆续会出现各种C程序。程序。均可作实验。均可作实验。出现的函数很多是各种功能的出现的函数很多是各种功能的linux系统调用,系统调用,注意多积累对系统调用的认识。注意多积累对系统调用的认识。2929n想实现某个功能,却不知道用哪个函数?想实现某个功能,却不知道用哪个函数?查手册查手册Linux函数库参考手册函数库参考手册(适合不知道什么功能该(适合不知道什么功能该用什么函数,以及函数的具体使用)用什么函数,以及函数的具体使用)man(适合知道函数名后查具体使用)(适合知道函数名后查具体使用)积累积累多读、多做多读、多做vi中在函数名处按中在函数名处按shift+k可看到函数说明信息可看到函数说明信息

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号