版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2023年4月13日第12章GCC的使用
与开发2023年4月13日主要内容gcc简介功能命令利用gcc编译c程序利用make工具简化编译过程make简介Makefile基本格式调试静态调试动态调试gdb调试工具的使用2023年4月13日gcc简介名称:GNUprojectC
andC++CompilerGNUCompilerCollection管理与维护GNU项目对C/C++编译的控制预处理(Preprocessing)编译(Compilation)汇编(Assembly)链接(Linking2023年4月13日gcc的使用基本使用格式$gcc[选项]<文件名>常用选项及含义gcc常用选项选项含义-ofile将经过gcc处理过的结果存为文件file,这个结果文件可能是预处理文件、汇编文件、目标文件或者最终的可执行文件。假设被处理的源文件为source.suffix,如果这个选项被省略了,那么生成的可执行文件默认名称为a.out;目标文件默认名为source.o;汇编文件默认名为source.s;生成的预处理文件则发送到标准输出设备。2023年4月13日gcc的常用选项gcc常用选项选项含义-c仅对源文件进行编译,不链接生成可执行文件。在对源文件进行查错时,或只需产生目标文件时可以使用该选项。-g[gdb]在可执行文件中加入调试信息,方便进行程序的调试。如果使用中括号中的选项,表示加入gdb扩展的调试信息,方便使用gdb来进行调试-O[0、1、2、3]对生成的代码使用优化,中括号中的部分为优化级别,缺省的情况为2级优化,0为不进行优化。注意,采用更高级的优化并不一定得到效率更高的代码。-Dname[=definition]将名为name的宏定义为definition,如果中括号中的部分缺省,则宏被定义为12023年4月13日gcc的常用选项gcc常用选项选项含义-Idir在编译源程序时增加一个搜索头文件的额外目录——dir,即include增加一个搜索的额外目录。-Ldir在编译源文件时增加一个搜索库文件的额外目录——dir-llibrary在编译链接文件时增加一个额外的库,库名为library.a-w禁止所有警告-Wwarning允许产生warning类型的警告,warning可以是:main、unused等很多取值,最常用是-Wall,表示产生所有警告。如果warning取值为error,其含义是将所有警告作为错误(error),即出现警告就停止编译。2023年4月13日gcc文件扩展名规范gcc可以根据文件扩展名执行操作gcc文件扩展名规范扩展名类型可进行的操作方式.cc语言源程序预处理、编译、汇编、链接.C,.cc,.cp,.cpp,.c++,.cxxc++语言源程序预处理、编译、汇编、链接.i预处理后的c语言源程序编译、汇编、链接.ii预处理后的c++语言源程序编译、汇编、链接.s预处理后的汇编程序汇编、链接.S未预处理的汇编程序预处理、汇编、链接.h头文件不进行任何操作.o目标文件链接2023年4月13日使用gcc编译代码源代码示例源程序——hello.c#include<stdio.h>intmain(void){ printf("hellogcc!\r\n"); return0;}2023年4月13日生成预处理文件命令$gcc–Ehello.c–ohello.i预处理文件hello.i的部分内容......externvoidfunlockfile(FILE*__stream);#679"/usr/include/stdio.h"3#2"hello.c"2intmain(void){printf("hellogcc!\n");return0;}2023年4月13日生成汇编文件命令$gcc–Shello.c–ohello.s汇编文件hello.s的部分内容......main: pushl %ebp movl %esp,%ebp........ addl $16,%esp movl $0,%eax leave ret......"2023年4月13日编译多个文件文件清单greeting.h#ifndef_GREETING_H#define_GREETING_Hvoidgreeting(char*name);#endifgreeting.c#include<stdio.h>#include"greeting.h"voidgreeting(char*name){printf("Hello%s!\r\n",name);}my_app.c#include<stdio.h>#include"greeting.h"#defineN10intmain(void){charname[N];printf("YourName,Please:");scanf("%s",name);greeting(name);return0;}2023年4月13日生成二进制文件生成目标文件命令:$gcc–chello.c–ohello.o生成可执行文件命令:$gcchello.c–ohello运行程序$./hello
hellogcc!2023年4月13日编译多个文件目录结构(1)编译命令$gccmy_app.cgreeting.c–omy_app目录结构(2)编译方式(1)$ gccmy_app.cfunctions/greeting.c–omy_app-Ifunction
greeting.h./greeting.cmy_app.cgreeting.h./greeting.cmy_app.cfunctions2023年4月13日编译多个文件目录结构(2)编译方式(2)分步编译命令:1、$gcc-cmy_app.c-Ifunctions2、$gcc-cfunctions/greeting.c3、$gccmy_app.ogreeting.o–omy_app思路:编译每一个.c文件,得到.o的目标文件;将每一个.o的目标文件链接成一个可执行的文件;2023年4月13日使用make工具适用场合:多个文件组成的软件项目基本格式:目标:欲生成的目标文件依赖项:生成目标需要的文件原理:判断依赖项是否为最新,否则,生成新的目标make工具的使用格式:make[[命令选项][命令参数]]通常使用make就可以了,make会寻找Makefile作为编译指导文件;目标:依赖项列表(Tab缩进)命令2023年4月13日使用make工具Makefile示例Makefile文件1my_app:greeting.omy_app.o2 gccmy_app.ogreeting.o-omy_app3greeting.o:functions\greeting.cfunctions\greeting.h4 gcc-cfunctions\greeting.c5my_app.o:my_app.cfunctions\greeting.h6 gcc–cmy_app.c–Ifunctions2023年4月13日使用make工具目标的依赖关系my_appmy_app.ogreeting.omy_app.cfunctions\greeting.hfunctions\greeting.cgcc–cmy_app.c–Ifunctionsgcc-cfunctions\greeting.cgccmy_app.ogreeting.o-omy_app2023年4月13日使用make工具更实用的Makefile更实用的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-Ifunctions2023年4月13日调试调试静态调试:在程序编译阶段查错并修正错误;主要为语法错误:输入错误;类型匹配错误;排错方式:利用错误、警告信息,并结合源文件环境排错动态调试:在程序运行阶段差错并修正错误;主要错误类型:算法错误;输入错误;排错方式:利用调试工具定位并修正错误;2023年4月13日调试举例源文件greeting.h#ifndef_GREETING_H#define_GREETING_Hvoidgreeting(char*name);#endifgreeting.c#include<stdio.h>#include"greeting.h"voidgreeting(char*name){printf("Hello!\r\n");}my_app.c1#include<stdio.h>2#include"greeting.h"3#defineN104intmain(void)5{6charname[n];7printf("YourName,Please:");8scanf("%s",name)9greeting(name);10/*return0;*/11}2023年4月13日静态调试举例分块编译greeting.c$gcc
-g-Wall
-cfunctions/greeting.c-g:将调试信息加入到编译的目标文件中;-Wall:将编译过程中的所有级别的警告都打印出来;无错误my_app.c$gcc-g-Wall-cmy_app.c-Ifunctions参数含义同上错误信息:
2023年4月13日调试举例错误信息:错误记录格式:文件名:行好:错误描述my_app.c:在函数’main’中:my_app.c:6:12:错误:‘n’未声明(在此函数内第一次使用)my_app.c:6:12:附注:每个未声明的标示符在其出现的函数内只报告一次my_app.c:6:7:警告:未使用的变量’name’[-Wunused-variable]my_app.c:11:1警告:在有返回值的函数中,控制流程到达函数尾[-Wreturn-type]2023年4月13日静态调试举例分析、定位错误(警告):my_app.c的第6行:描述含义:n是一个没有声明的变量;分析:声明数字name时用到了变量n,但变量n在之前没有声明;改正:声明一个新变量n;或者将n改为宏N这里取第2种改正方法;2023年4月13日静态调试举例my_app.c的第9行:描述含义:在“greeting”之前出现解析错误;分析:c中每行程序以;结束,第9行greeting之前的程序行没有以;结束;改正:第8行末尾增加“;”重新编译错误信息:my_app.c:11:1警告:在有返回值的函数中,控制流程到达函数尾[-Wreturn-type]2023年4月13日静态调试举例分析、定位错误(警告):警告:my_app.c的11行描述含义:控制以非空函数结束;分析:main函数返回类型为int,源程序没有以return整数形式结束;改正:将main改为返回void类型;或者:在main程序后增加return返回语句;采用第2种解决方式;重新编译,无错误或警告信息,完成静态调试2023年4月13日静态调试举例静态调试总结主要为语法错误:输入错误;类型匹配错误;分析信息:主要来自gcc编译时产生的提示信息错误警告定位:不一定在提示信息描述的地方;综合分析提示信息及提示行的上下文环境,定位并修正错误、警告。有的警告可以不用修复;2023年4月13日动态调试举例
常见的动态调试方法:增加调试语句;记录程序的执行状况;观察内存变化;使用调试工具;GUNDebuger的功能:启动程序,设置程序执行的上下文环境;在指定的条件下停止程序;程序停止时,检查程序的状态;在程序运行时,改变程序状态,使其按照改变后的状态继续执行。2023年4月13日动态调试举例gdb常用的调试命令命令含义file指定需要进行调试的程序step单步(行)执行,如果遇到函数会进入函数内部next单步(行)执行,如果遇到函数不会进入函数内部run启动被执行的程序quit退出gdb调试环境print查看变量或者表达式的值break设置断点,程序执行到断点就会暂停起来shell执行其后的shell命令list查看指定文件或者函数的源代码,并标出行号2023年4月13日动态调试举例对静态调试中的例子继续进行动态调试工具:gdb启动gdb$gdb GNUgdb(GDB)Fedora7.8.2-38.fc21Copyright(C)2014FreeSoftwareFoundation,Inc.LicenseGPLv3+:GNUGPLversion3orlater……Forhelp,type"help".Type"aproposword"tosearchforcommandsrelatedto"word".(gdb)启动命令启动提示启动完毕2023年4月13日动态调试举例调试指定程序(./my_app)问题:期望的输出和实际输出不一致(gdb)file./my_app Readingsymbolsfrom./my_app...done(gdb)runStartingprogram:/home/tom/shell_script/cpp/my_app/my_appYourName,Please:tomHello![Inferior1(process4074)exitednormally].(gdb)加载调试程序启动调试程序程序输出提示信息2023年4月13日动态调试举例初次错误定位:输出有错误错误定位重新开始一次调试;启动gdb;加载调试程序(./my_app);查看程序源代码命令:list文件名2023年4月13日动态调试举例(gdb)listmy_app.c:1,201 #include<stdio.h>2 #include"greeting.h"3 #defineN104 intmain(void)5 {6 charname[N];7 printf("YourName,Please:");8 scanf("%s",name);9 greeting(name);10 return0;11 }(gdb)break7BreakPoint1at0x8048384: filemy_app.c,line7.在程序第7行设置断点命令:(gdb)break7查看源代码设置断点提示信息2023年4月13日动态调试举例错误详细定位1(gdb)run2Startingprogram:/home/tom/shell_script/cpp/my_app/my_app3Breakpoint1,main()atmy_app.c:747 printf("YourName,Please:");5(gdb)next68scanf("%s",name);7(gdb)next8YourName,Please:tom99greeting(name);启动调
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年河南省汝州市高三生物上册期末考试模拟试卷及答案【有一套】
- 2026年电力公司应聘笔试题及答案
- 2026年贵州省兴义市高三生物上册期末考试模拟测试卷及参考答案(轻巧夺冠)
- 2026年河南省舞钢市高三生物上册期末考试模拟试卷含答案(能力提升)
- 2026年基孔肯雅热登革热考试题(含答案)
- 2026年浙江省诸暨市高三生物上册期末考试模拟卷【有一套】附答案
- 2026年湖南省常宁市高二生物下册期末考试模拟卷附参考答案AB卷
- 2026年江西省庐山市高二生物下册期末考试模拟卷附参考答案【培优】
- 2026年广东省兴宁市高二生物下册期末考试试卷必考题附答案
- 2026年山东省龙口市高二生物下册期末考试检测卷及答案(名师系列)
- 2026云南黄金矿业集团股份有限公司第一次招聘工作人员13人备考题库及一套参考答案详解
- 2026年传染病培训试题(+答案)
- 华南理工大学2026年强基计划面试模拟试题及答案解析
- JT-GQB-015-1998公路桥涵标准钢筋混凝土圆管涵洞
- 艺术中国智慧树知到期末考试答案2024年
- 北京市气膜体育场馆隐患自查清单(2024年度)
- 矿粉塑性指数(自动计算)
- 墨西哥与中美洲古代文明:考古与文化史
- 十字路口交通灯信号PLC控制系统设计与调试
- 2023年10月中国互联网发展基金会招考2名工作人员笔试历年难易错点考题荟萃附带答案详解
- 孕期营养与体重管理
评论
0/150
提交评论