第1章 嵌入式linuxC语言开发工具_第1页
第1章 嵌入式linuxC语言开发工具_第2页
第1章 嵌入式linuxC语言开发工具_第3页
第1章 嵌入式linuxC语言开发工具_第4页
第1章 嵌入式linuxC语言开发工具_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、课程目标课程目标:本课程将嵌入式系统中经常用到的本课程将嵌入式系统中经常用到的C C编编程技巧与概念介绍给大家,并且能在程技巧与概念介绍给大家,并且能在Linux下使用下使用C语言编写一些实际的应用程序语言编写一些实际的应用程序先修课程:先修课程:C C语言编程(我们假设同学门已经了解语言编程(我们假设同学门已经了解基本的基本的C C语法,并至少在一个编译器环境中编写过语法,并至少在一个编译器环境中编写过C C语言,虽然我们在课程中有语言,虽然我们在课程中有4 4个小时左右的个小时左右的C C语言复语言复习)习)学时分配:学时分配:总学时总学时4848小时,小时,其中授课其中授课2424小时,

2、实验(小时,实验(ProjectProject)2424小时小时 要求学生独立完成一个中等规模的要求学生独立完成一个中等规模的C C语言项目。语言项目。 (1)C C程式设计语言程式设计语言 (The C Programming Language )(The C Programming Language ) 作者:作者:Brian W.Kernighan, Dennis M.RitchieBrian W.Kernighan, Dennis M.Ritchie 简介:本书是由简介:本书是由C C语言的设计者语言的设计者Brian W. KernighanBrian W. Kernighan和和D

3、ennis M. Dennis M. RitchieRitchie编写的一部介绍标准编写的一部介绍标准C C语言及其程式设计方法的权威性经典著作。一语言及其程式设计方法的权威性经典著作。一本必读的程式设计语言方面的参考书。本必读的程式设计语言方面的参考书。 (2)C Primer PlusC Primer Plus中文版中文版(C Primer Plus)(C Primer Plus) 作者:作者:Stephen PrataStephen Prata 简介:作为核心计算机技术成熟、完整的参考书籍,简介:作为核心计算机技术成熟、完整的参考书籍,Primer PlusPrimer Plus系列系列

4、历经十数年不衰,通过学习历经十数年不衰,通过学习C Primer Plus(C Primer Plus(第五版第五版) )中文版中文版,你将奠定,你将奠定坚实的坚实的C C编程基础。编程基础。 (3)C C和指针和指针(Pointers on C)(Pointers on C) 作者:作者:Kenneth A.ReekKenneth A.Reek 简介:本书提供和简介:本书提供和C C语言编程相关的全方面资源和深入讨论。全书覆盖语言编程相关的全方面资源和深入讨论。全书覆盖了数据、语句、操作符和表达式、指针、函数、数组、字符串、结构和联合了数据、语句、操作符和表达式、指针、函数、数组、字符串、结

5、构和联合等几乎所有重要的等几乎所有重要的C C编程话题。书中给出了非常多编程技巧和提示。编程话题。书中给出了非常多编程技巧和提示。参考书籍和资料参考书籍和资料- C语言语言初级初级教材教材 (1)C C陷阱和缺陷陷阱和缺陷(C Traps and Pitfalls)(C Traps and Pitfalls) 作者:作者:Andrew Koenig Andrew Koenig 简介:作者以自己简介:作者以自己19851985年在年在BellBell实验室时发表的一篇论文为基础,结实验室时发表的一篇论文为基础,结合自己的工作经验扩展成为这本对合自己的工作经验扩展成为这本对C C程式员具有珍贵价值

6、的经典著作。本书程式员具有珍贵价值的经典著作。本书的出发点不是要批判的出发点不是要批判C C语言,而是要帮助语言,而是要帮助C C程式员绕过编程过程中的陷阱和程式员绕过编程过程中的陷阱和障碍。障碍。 (2)C C专家编程专家编程(Expert C Programming )(Expert C Programming ) 作者:作者:Perter Van Der LinDenPerter Van Der LinDen 简介:展示了最优秀的简介:展示了最优秀的C C程式员所使用的编码技巧。程式员所使用的编码技巧。 书中书中C C的历史、语的历史、语言特性、声明、数组、指针、链接、运行时、内存及怎么

7、进一步学习言特性、声明、数组、指针、链接、运行时、内存及怎么进一步学习C+C+等等问题进行了细致的讲解和深入的分析。全书撷取几十个实例进行讲解,对问题进行了细致的讲解和深入的分析。全书撷取几十个实例进行讲解,对C C程式员具有非常高的实用价值程式员具有非常高的实用价值。 (3)C C语言编程常见问题解答语言编程常见问题解答(C Programming : Just the Faqs(C Programming : Just the Faqs ) ) 作者:作者:Paul S.R.ChisholmPaul S.R.Chisholm 等等 简介:这是一本专门解答简介:这是一本专门解答c c语言编程

8、常见问题的著作。书中所覆盖的内语言编程常见问题的著作。书中所覆盖的内容相当广泛,并附有大量鲜明的例子容相当广泛,并附有大量鲜明的例子。参考书籍和资料参考书籍和资料- C语言语言进阶进阶书籍书籍 (1)(1) C/C+C/C+嵌入式系统编程嵌入式系统编程(Programming Embedded Systems in C (Programming Embedded Systems in C and C+)and C+) 作者:作者:Michael Barr Michael Barr 简介:本书中的技术和范例代码均可直接应用于各种实际的嵌入式系统简介:本书中的技术和范例代码均可直接应用于各种实际的

9、嵌入式系统项目。有过嵌入式系统研发经验的读者,也将从中获益匪浅。项目。有过嵌入式系统研发经验的读者,也将从中获益匪浅。 (2) (2) 嵌入式实时操作系统嵌入式实时操作系统C/OS-IIC/OS-II(MicroC/OS-II(MicroC/OS-II The Real-Time The Real-Time Kernel)Kernel) 作者:作者:Jean J.LabrosseJean J.Labrosse 简介:简介:CC/OSII/OSII是源码公开的实时内核,是专为嵌入式应用设计的。通是源码公开的实时内核,是专为嵌入式应用设计的。通过对过对CC/OSII/OSII原始码的分析和描述,讲

10、述了多任务实时的基本概念、竞争和原始码的分析和描述,讲述了多任务实时的基本概念、竞争和调度算法、任务间同步和通信、存储和定时的管理及怎么处理优先级反转问调度算法、任务间同步和通信、存储和定时的管理及怎么处理优先级反转问题;介绍怎么将题;介绍怎么将CC/OSII/OSII移植到不同移植到不同CPUCPU上,怎么调试移植代码。上,怎么调试移植代码。 (3) (3) 嵌入式系统构件嵌入式系统构件(Embedded Systems Building Blocks )(Embedded Systems Building Blocks ) 作者:作者: Jean J.LabrosseJean J.Labr

11、osse 简介:本书介绍了构建嵌入式系统的一些通用模块,如键盘扫描器、显简介:本书介绍了构建嵌入式系统的一些通用模块,如键盘扫描器、显示器接口、计量器和输入示器接口、计量器和输入/ /输出。大部分代码都是用可移植的输出。大部分代码都是用可移植的C C语言编写。语言编写。参考书籍和资料参考书籍和资料-嵌入式编程书籍嵌入式编程书籍1. 1. 会会C C语法与会用语法与会用C C语言写程序是两个概念语言写程序是两个概念2. C2. C的灵活性以及由此而产生的陷阱非常非常多的灵活性以及由此而产生的陷阱非常非常多3. The Most Beautiful Language and Most 3. The

12、 Most Beautiful Language and Most Dangerous Language in the Programming World!Dangerous Language in the Programming World!学习学习C C语言的误区语言的误区第第1章章 嵌入式嵌入式Linux C语言开发工具语言开发工具本章内容本章内容1.1 嵌入式嵌入式Linux下下C语言概述语言概述1.2 嵌入式嵌入式Linux编辑器编辑器vi的使用的使用1.3 嵌入式嵌入式Linux编译器编译器GCC的使用的使用 1.4 嵌入式嵌入式Linux调试器调试器GDB的使用的使用 1.5 m

13、ake工程管理器工程管理器 1.6 Eclipse集成开发环境集成开发环境 本章小结本章小结1.1 嵌入式嵌入式Linux下下C语言概述语言概述 1.1.1 C语言简史语言简史 1.1.2 C语言特点语言特点 1.1.3 嵌入式嵌入式Linux C语言编程环境语言编程环境 1.1.1 C语言简史语言简史 C语言语言最初最初是美国贝尔实验室的是美国贝尔实验室的D.M.Ritchie在在B语言的基础上设计出来语言的基础上设计出来的,此时的的,此时的C语言只是为了描述和实现语言只是为了描述和实现UNIX操作系统的一种工作语言。在操作系统的一种工作语言。在一段时间里,一段时间里,C语言还只在贝尔实验室

14、内部使用。语言还只在贝尔实验室内部使用。1975年年,UNIX第第6版公布后,版公布后,C语言突出的优点引起人们的普遍注意。语言突出的优点引起人们的普遍注意。1977年年出现了可移植的出现了可移植的C语言。语言。1978年年UNIX第第7版的版的C语言成为后来被广泛使用的语言成为后来被广泛使用的C语言版本的基础,被语言版本的基础,被称为标准称为标准C语言。语言。1983年年,美国国家标准化协会(,美国国家标准化协会(ANSI)根据)根据C语言问世以来的各种版本,语言问世以来的各种版本,对对C语言进行发展和扩充,并制定了新的标准,称为语言进行发展和扩充,并制定了新的标准,称为ANSI C。199

15、0年年,国际标准化组织,国际标准化组织ISO制定了制定了ISO C标准,目前流行的标准,目前流行的C语言编译系语言编译系统都是以它为标准的。统都是以它为标准的。1.1.2 C语言特点语言特点C语言是结构化的语言语言是结构化的语言 采用代码及数据分隔的方式,使程序的各部分独立采用代码及数据分隔的方式,使程序的各部分独立以函数的形式提供给用户,方便调用以函数的形式提供给用户,方便调用C语言是模块化的语言语言是模块化的语言 减少重复编程,减少劳动量,提高编程效率减少重复编程,减少劳动量,提高编程效率程序可移植性好程序可移植性好 不同机器上的编译程序大约有不同机器上的编译程序大约有80%的代码是公共的

16、的代码是公共的 C语言运算符丰富、代码效率高语言运算符丰富、代码效率高C语言共有语言共有34种运算符,使用各种运算符可以实现在其他高级语言中种运算符,使用各种运算符可以实现在其他高级语言中难以实现的运算。难以实现的运算。 1.1.3 嵌入式嵌入式Linux C语言编程环境语言编程环境 编辑器编辑器 常用的编辑器有常用的编辑器有vi(vim)和)和Emacs 编译链接器编译链接器 常用的编译器是常用的编译器是GCC编译器编译器 调试器调试器 GDB 项目管理器项目管理器 项目管理器项目管理器make1.2 嵌入式嵌入式Linux编辑器编辑器vi的使用的使用 1.2.1 vi的基本模式的基本模式

17、1.2.2 vi的基本操作的基本操作 1.2.3 vi的使用实例分析的使用实例分析1.2.1 vi (vim)的基本模式的基本模式 命令行模式(命令行模式(Command Mode) 在该模式下用户可以输入命令来控制屏幕光标的移动,在该模式下用户可以输入命令来控制屏幕光标的移动,字符、单词或行的删除,移动复制某区段,也可以进入字符、单词或行的删除,移动复制某区段,也可以进入到底行模式或者插入模式下。到底行模式或者插入模式下。 插入模式(插入模式(Insert Mode) 用户只有在插入模式下才可以进行字符输入,用户按用户只有在插入模式下才可以进行字符输入,用户按Esc键可回到命令行模式下。键可

18、回到命令行模式下。 底行模式(底行模式(Last Line Mode) 在该模式下,用户可以将文件保存或退出在该模式下,用户可以将文件保存或退出vi,也可以设,也可以设置编辑环境,如寻找字符串、显示行号等。这一模式下置编辑环境,如寻找字符串、显示行号等。这一模式下的命令都是以的命令都是以“:”开始。开始。 1.2.2 vi (vim)的基本操作的基本操作 进入与离开进入与离开 进入进入vi可以直接在系统提示符下键入可以直接在系统提示符下键入vi 文档名称,文档名称,vi可以自动载入所要编辑的文档或是创建一个新的文档。可以自动载入所要编辑的文档或是创建一个新的文档。如在如在shell中键入中键入

19、vi hello.c(新建文档)即可进入(新建文档)即可进入vi画面画面. 进入进入vi后屏幕最左边会出现波浪符号,凡是有该符号就后屏幕最左边会出现波浪符号,凡是有该符号就代表该行目前是空的。此时进入的是命令行模式。代表该行目前是空的。此时进入的是命令行模式。 要离开要离开vi可以在底行模式下键入可以在底行模式下键入“:q”(不保存离开),(不保存离开),“:wq”(保存离开)则是存档后再离开(注意冒号)。(保存离开)则是存档后再离开(注意冒号)。 在vi中打开/新建文档171.2.2 vi (vim)的基本操作的基本操作 在vi中退出文档 1.2.2 vi (vim)的基本操作的基本操作 v

20、i中中3种模式的切换种模式的切换 (1)命令行模式、底行模式转为插入模式)命令行模式、底行模式转为插入模式特特 征征命令命令作作 用用新增新增a从光标所在位置后面开始新增资料,光标后的从光标所在位置后面开始新增资料,光标后的资料随新增资料向后移动资料随新增资料向后移动A从光标所在列最后面的地方开始新增资料从光标所在列最后面的地方开始新增资料插入插入i从光标所在位置前面开始插入资料,游标后的从光标所在位置前面开始插入资料,游标后的资料随新增资料向后移动资料随新增资料向后移动I从光标所在列的第一个非空白字元前面开始插从光标所在列的第一个非空白字元前面开始插入资料入资料开始开始o在光标所在列下方新增

21、一列,并进入插入模式在光标所在列下方新增一列,并进入插入模式O在光标所在列上方新增一列,并进入插入模式在光标所在列上方新增一列,并进入插入模式 vi中中3种模式的切换种模式的切换 (续)(续) (2)插入模式转为命令行模式、底行模式)插入模式转为命令行模式、底行模式从插入模式转为命令行模式、底行模式从插入模式转为命令行模式、底行模式比较简单,只需使用比较简单,只需使用Esc键即可。键即可。 (3)命令行模式与底行模式转换)命令行模式与底行模式转换命令行模式与底行模式间的转换不需要命令行模式与底行模式间的转换不需要其他特别的命令,而只需要直接键入相应模其他特别的命令,而只需要直接键入相应模式中的

22、命令键即可。式中的命令键即可。1.2.2 vi (vim)的基本操作的基本操作 vi的删除、修改与复制的删除、修改与复制 特特 征征ARM作作 用用删除删除x x删除光标所在的字符删除光标所在的字符dddd删除光标所在的行删除光标所在的行s s删除光标所在的字符,并进入输入模式删除光标所在的字符,并进入输入模式S S删除光标所在的行,并进入输入模式删除光标所在的行,并进入输入模式修改修改r r 待修改字待修改字符符修改光标所在的字符,键入修改光标所在的字符,键入r后直接键入待修改后直接键入待修改字符字符R R进入取代状态,可移动光标键入所指位置的修改进入取代状态,可移动光标键入所指位置的修改字

23、符,该取代状态直到按字符,该取代状态直到按Esc才结束才结束复制复制yyyy复制光标所在的行复制光标所在的行nyynyy复制光标所在的行向下复制光标所在的行向下n行行p p将缓冲区内的字符粘贴到光标所在位置将缓冲区内的字符粘贴到光标所在位置1.2.2 vi (vim)的基本操作的基本操作 vi的光标移动的光标移动 指指 令令作作 用用0移动到光标所在行的最前面移动到光标所在行的最前面$移动到光标所在行的最后面移动到光标所在行的最后面Ctrld光标向下移动半页光标向下移动半页Ctrlf光标向下移动一页光标向下移动一页H光标移动到当前屏幕的第一行第一列光标移动到当前屏幕的第一行第一列M光标移动到当

24、前屏幕的中间行第一列光标移动到当前屏幕的中间行第一列L光标移动到当前屏幕的最后行第一列光标移动到当前屏幕的最后行第一列b移动到上一个字的第一个字母移动到上一个字的第一个字母w移动到下一个字的第一个字母移动到下一个字的第一个字母e移动到下一个字的最后一个字母移动到下一个字的最后一个字母移动到光标所在行的第一个非空白字符移动到光标所在行的第一个非空白字符n-向上移动向上移动n行行n+向下移动向下移动n行行nG移动到第移动到第n行行1.2.2 vi (vim)的基本操作的基本操作 vi的查找与替换的查找与替换 特特 征征ARM作作 用用查找查找/向下查找要查找的字符向下查找要查找的字符?向上查找要查

25、找的字符向上查找要查找的字符替换替换:0,$s/string1/string2/g0,$:替换范围从第:替换范围从第0行到最后行到最后一行一行s:转入替换模式:转入替换模式string1/string2:把所有把所有string1替换为替换为string2g:强制替换而不提示:强制替换而不提示1.2.2 vi (vim)的基本操作的基本操作 vi的文件操作指令的文件操作指令 指指 令令作作 用用:q结束编辑,退出结束编辑,退出vi:q!不保存编辑过的文档不保存编辑过的文档:w保存文档,其后可加要保存的文件名保存文档,其后可加要保存的文件名:wq保存文档并退出保存文档并退出:zz功能与功能与“:

26、wq”相同相同:x功能与功能与“:wq”相同相同1.2.2 vi (vim)的基本操作的基本操作1.2.3 vi (vim)的使用实例分析的使用实例分析 vi使用实例内容使用实例内容 (1)在)在/root目录下建一个名为目录下建一个名为vi的目录。的目录。(2)进入)进入vi目录。目录。(3)将文件)将文件/etc/inittab复制到当前目录复制到当前目录下。下。(4)使用)使用vi编辑当前目录下的编辑当前目录下的inittab。(5)将光标移到该行。)将光标移到该行。(6)复制该行内容。)复制该行内容。(7)将光标移到最后一行行首。)将光标移到最后一行行首。(8)粘贴复制行的内容。)粘贴

27、复制行的内容。(9)撤销第)撤销第9步的动作。步的动作。(10)将光标移动到最后一行的行尾。)将光标移动到最后一行的行尾。(11)粘贴复制行的内容。)粘贴复制行的内容。(12)光标移到)光标移到“si:sysinit:/etc/rc.d/rc.sysinit”。(13)删除该行。)删除该行。(14)存盘但不退出。)存盘但不退出。(15)将光标移到首行。)将光标移到首行。(16)插入模式下输入)插入模式下输入“Hello,this is vi world!”。(17)返回命令行模式。)返回命令行模式。(18)向下查找字符串)向下查找字符串“0:wait”。(19)再向上查找字符串)再向上查找字符

28、串“halt”。(20)强制退出)强制退出vi,不存盘。,不存盘。 vi使用实例解析使用实例解析(1)mkdir /root/vi(2)cd /root/vi(3)cp /etc/inittab ./(4)vi ./inittab(5)17(命令行模式)(命令行模式)(6)yy(7)G(8)p(9)u(10)$(11)P(12)21G(13)dd(14):w(底行模式)(底行模式)(15)1G(16)i 并输入并输入“Hello,this is vi world!”(插入模式)(插入模式)(17)Esc(18)/0:wait(命令行(命令行模式)模式)(19)?halt(20):q!(底行模式

29、)(底行模式)1.2.3 vi (vim)的使用实例分析的使用实例分析1.3嵌入式嵌入式Linux编译器编译器GCC的使用的使用 1.3.1 GCC概述概述 1.3.2 GCC编译流程分析编译流程分析 1.3.3 GCC警告提示警告提示 1.3.4 GCC使用库函数使用库函数 1.3.5 GCC代码优化代码优化1.3.1 GCC概述概述 GCC除了能支持除了能支持C语言外,语言外,目前还支持目前还支持Ada语言、语言、C+语言、语言、Java语言、语言、Objective C语言、语言、PASCAL语言、语言、COBOL语言,以及支语言,以及支持函数式编程和逻辑编程的持函数式编程和逻辑编程的M

30、ercury语言等语言等 GCC的编译流程分为了的编译流程分为了4个个步骤,分别为步骤,分别为 预处理(预处理(Pre-Processing) 编译(编译(Compiling) 汇编(汇编(Assembling) 链接(链接(Linking)后缀名后缀名所对应的语言所对应的语言编编 译译 流流 程程.cC原始程序原始程序预处理、编译、预处理、编译、汇编汇编.C .cc.cxxC+原始程序原始程序预处理、编译、预处理、编译、汇编汇编.mObjective-C原始原始程序程序预处理、编译、预处理、编译、汇编汇编.i已经过预处理的已经过预处理的C原始程序原始程序编译、汇编编译、汇编.ii已经过预处理

31、的已经过预处理的C+原始程序原始程序编译、汇编编译、汇编.s .S汇编语言原始程序汇编语言原始程序汇编汇编.h预处理文件(头文预处理文件(头文件)件)(不常出现在指(不常出现在指令行)令行).o目标文件目标文件链接链接.a/.so编译后的库文件编译后的库文件链接链接1.3.2 GCC编译流程分析编译流程分析 GCC使用的基本语法为:使用的基本语法为: gcc option | filename 预处理阶段预处理阶段 gcc E o 目标文件目标文件 编译文件编译文件 选项选项“-E”可以使编译器在预处理结束时就停止编译可以使编译器在预处理结束时就停止编译 选项选项“-o”是指定是指定GCC输出

32、的结果。输出的结果。 编译阶段编译阶段 gcc S o hello.s hello.i 选项选项“-S”能使编译器在进行完编译之后就停止能使编译器在进行完编译之后就停止 汇编阶段汇编阶段 gcc c hello.s o hello.o 选项选项“-c”把编译阶段生成的把编译阶段生成的“.s”文件生成目标文文件生成目标文件件 “.o” 链接阶段链接阶段 gcc hello.o o hello 可以生成可执行文件可以生成可执行文件 1.3.2 GCC编译流程分析编译流程分析1.3.3 GCC警告提示警告提示 Wall类警告提示类警告提示 选选 项项作作 用用-Wall打开所有类型语法警告,建议读者

33、养成使用该选项的习惯打开所有类型语法警告,建议读者养成使用该选项的习惯-Wchar-subscripts如果数组使用如果数组使用char类型变量做为下标值的话,则发出警告。类型变量做为下标值的话,则发出警告。因为在某些平台上可能默认为因为在某些平台上可能默认为signed char,一旦溢出,一旦溢出,就可能导致某些意外的结果就可能导致某些意外的结果-Wcomment当当/*出现在出现在 /* . */注释中,或者注释中,或者出现在出现在/ .注释结尾注释结尾处时,使用处时,使用-Wcomment会给出警告,它很可能会影响会给出警告,它很可能会影响程序的运行结果程序的运行结果-Wformat检

34、查检查printf和和scanf等格式化输入输出函数的格式字符串与等格式化输入输出函数的格式字符串与参数类型的匹配情况,如果发现不匹配则发出警告。某参数类型的匹配情况,如果发现不匹配则发出警告。某些时候格式字符串与参数类型的不匹配会导致程序运行些时候格式字符串与参数类型的不匹配会导致程序运行错误,所以这是个很有用的警告选项错误,所以这是个很有用的警告选项-Wimplicit该警告选项实际上是该警告选项实际上是-Wimplicit-int和和-Wimplicit-function-declaration两个警告选项的集合。前者在声两个警告选项的集合。前者在声明函数却未指明函数返回类型时给出警告,

35、后者则是在明函数却未指明函数返回类型时给出警告,后者则是在函数声明前调用该函数时给出警告函数声明前调用该函数时给出警告1.3.3 GCC警告提示警告提示 Wall类警告提示类警告提示 选选 项项作作 用用-Wmissing-braces当聚合类型或者数组变量的初始化表达式没有充分用括号当聚合类型或者数组变量的初始化表达式没有充分用括号括起时,给出警告括起时,给出警告-Wparentheses这是一个很有用的警告选项,它能帮助用户从那些看起来这是一个很有用的警告选项,它能帮助用户从那些看起来语法正确但却由于操作符优先级或者代码结构语法正确但却由于操作符优先级或者代码结构“障眼障眼”而导致错误运行

36、的代码中解脱出来而导致错误运行的代码中解脱出来-Wsequence-point关于顺序点(关于顺序点(sequence point),在),在C标准中有解释,不标准中有解释,不过很晦涩。我们在平时编码中尽量避免写出与实现相关、过很晦涩。我们在平时编码中尽量避免写出与实现相关、受实现影响的代码便是了。而受实现影响的代码便是了。而-Wsequence-point选项选项恰恰可以帮我们这个忙,它可以帮我们查出这样的代码恰恰可以帮我们这个忙,它可以帮我们查出这样的代码来,并给出其警告来,并给出其警告-Wswitch这个选项的功能浅显易懂,通过文字描述也可以清晰地说这个选项的功能浅显易懂,通过文字描述也

37、可以清晰地说明。当以一个枚举类型(明。当以一个枚举类型(enum)作为)作为switch语句的索语句的索引时但却没有处理引时但却没有处理default情况,或者没有处理所有枚举情况,或者没有处理所有枚举类型定义范围内的情况时,该选项会给出警告类型定义范围内的情况时,该选项会给出警告1.3.3 GCC警告提示警告提示 Wall类警告提示类警告提示 选选 项项作作 用用-Wunused-function警告存在一个未使用的警告存在一个未使用的static函数的定义或者存在一个只函数的定义或者存在一个只声明却未定义的声明却未定义的static函数函数-Wunused-label用来警告存在一个使用了

38、却未定义或者存在一个定义了却用来警告存在一个使用了却未定义或者存在一个定义了却未使用的未使用的label-Wunused-variable用来警告存在一个定义了却未使用的局部变量或者非常量用来警告存在一个定义了却未使用的局部变量或者非常量static变量变量-Wunused-value用来警告一个显式计算表达式的结果未被使用用来警告一个显式计算表达式的结果未被使用-Wunused-parameter用来警告一个函数的参数在函数的实现中并未被用到用来警告一个函数的参数在函数的实现中并未被用到-Wuninitialized该警告选项用于检查一个局部自动变量在使用之前是否已该警告选项用于检查一个局部

39、自动变量在使用之前是否已经初始化了或者在一个经初始化了或者在一个longjmp调用可能修改一个调用可能修改一个non-volatile automatic variable时给出警告时给出警告非非Wall类警告提示类警告提示 (1)“-ansi” 该选项强制该选项强制GCC生成标准语法所要求的告警信息,尽管生成标准语法所要求的告警信息,尽管这还并不能保证所有没有警告的程序都是符合这还并不能保证所有没有警告的程序都是符合ANSI C标标准的。准的。 (2)“-pedantic” 该选项允许发出该选项允许发出ANSI C标准所列的全部警告信息,同样标准所列的全部警告信息,同样也不能保证所有没有警告

40、的程序都是符合也不能保证所有没有警告的程序都是符合ANSI C标准的。标准的。 1.3.3 GCC警告提示警告提示 Linux函数库介绍函数库介绍 Linux中函数库包括两类:静态库和共享库。中函数库包括两类:静态库和共享库。 静态库的代码在编译时就已连接到开发人员开静态库的代码在编译时就已连接到开发人员开发的应用程序中,而共享库是在程序开始运行发的应用程序中,而共享库是在程序开始运行时被加载。时被加载。 系统中可用的库都安装在系统中可用的库都安装在/usr/lib和和/lib目录下。目录下。库文件名由前缀库文件名由前缀lib和库名以及后缀组成。根据和库名以及后缀组成。根据库的类型不同,后缀名

41、也不一样。库的类型不同,后缀名也不一样。1.3.4 GCC使用库函数使用库函数 相关路径选项相关路径选项 (1)“-I ” GCC使用缺省的路径来搜索头文件,如果想要改变搜索使用缺省的路径来搜索头文件,如果想要改变搜索路径,用户可以使用路径,用户可以使用“-I”选项。选项。“-I”选项可以在选项可以在头文件的搜索路径列表中添加头文件的搜索路径列表中添加目录。这样,目录。这样,GCC就会到指定的目录去查找相应的头文件。就会到指定的目录去查找相应的头文件。 (2)“-L ” 选项选项“-L ”的功能与的功能与“-I ”类似,其区别就在类似,其区别就在于于“-L”选项是用于指明库文件的路径。选项是用

42、于指明库文件的路径。 gcc hello_sq.c L/root/workspace/gcc/lib lsunq o hello_sq 1.3.4 GCC使用库函数使用库函数 使用不同类型链接库使用不同类型链接库 使用不同类型的链接库的方法很相似,都是使用使用不同类型的链接库的方法很相似,都是使用选项是选项是“-l”(注意这里是小写的(注意这里是小写的“L”)。该选项)。该选项是用于指明具体使用的库文件。由于在是用于指明具体使用的库文件。由于在Linux中函中函数库的命名规则都是以数库的命名规则都是以“lib”开头的,因此,这里开头的,因此,这里的库文件只需填写的库文件只需填写lib之后的内容

43、即可。之后的内容即可。 gcc -o dynamic -L /root/lq/testc/lib/dynamic.o -lmydynamic1.3.4 GCC使用库函数使用库函数1.3.5 GCC代码优化代码优化 GCC可以对代码进行优化,它通过编译选项可以对代码进行优化,它通过编译选项-On来控制优化代码的生成,其中来控制优化代码的生成,其中n是一个代表优化级是一个代表优化级别的整数。别的整数。 虽然优化选项可以加快代码的运行速度,但对于虽然优化选项可以加快代码的运行速度,但对于调试而言将是一个很大的挑战。因为代码在经过调试而言将是一个很大的挑战。因为代码在经过优化之后,原先在源程序中声明和

44、使用的变量很优化之后,原先在源程序中声明和使用的变量很可能不再使用,控制流也可能会突然跳转到其他可能不再使用,控制流也可能会突然跳转到其他的地方,循环语句也有可能因为循环展开而变得的地方,循环语句也有可能因为循环展开而变得到处都有,所有这些都将使调试工作异常艰难。到处都有,所有这些都将使调试工作异常艰难。1.4 嵌入式嵌入式Linux调试器调试器GDB的使用的使用 1.4.1 GDB使用实例使用实例 1.4.2设置设置/删除断点删除断点 1.4.3数据相关命令数据相关命令 1.4.4调试运行环境相关命令调试运行环境相关命令 1.4.5堆栈相关命令堆栈相关命令 1.4.1 GDB使用实例使用实例

45、 进入进入GDB gdb test 查看文件查看文件l 设置断点设置断点 b 6 查看断点处情况查看断点处情况 info b 运行代码运行代码 r 查看变量值查看变量值 p n / p i 观察变量观察变量 watch n 单步运行单步运行 n 程序继续运行程序继续运行 c 退出退出GDB q1.4.2设置设置/删除断点删除断点命命 令令 格格 式式作作 用用break+设置断点设置断点的行号的行号用于在程序中对应行设置断点用于在程序中对应行设置断点tbreak+行号或函数名行号或函数名设置临时断点,到达后被自动删除设置临时断点,到达后被自动删除break+filename+行号行号用于在指定

46、文件的对应行设置断点用于在指定文件的对应行设置断点break+用于在内存某一位置处暂停用于在内存某一位置处暂停break+行号行号+if+条件条件用于设置条件断点,在循环中使用非常方便用于设置条件断点,在循环中使用非常方便info breakpointswatchpoints查看断点查看断点/观察点的情况观察点的情况clear+要清除要清除断点的行号断点的行号用于清除对应行的断点用于清除对应行的断点1.4.2 设置设置/删除断点删除断点命命 令令 格格 式式作作 用用delete+要清除要清除断点的编号断点的编号用于清除断点和自动显示的表达式的命令。与用于清除断点和自动显示的表达式的命令。与c

47、lear的不同之处:的不同之处:clear要给出断点的行号,要给出断点的行号,delete要要给出断点的编号。用给出断点的编号。用clear命令清除断点时命令清除断点时GDB会会给出提示,而用给出提示,而用delete清除断点时清除断点时GDB不会给出不会给出任何提示任何提示disable+断点编号断点编号让所设断点暂时失效。如果要让多个编号处的断点让所设断点暂时失效。如果要让多个编号处的断点失效可将编号之间用空格隔开失效可将编号之间用空格隔开enable+断点编号断点编号与与disable相反相反awatch+变量变量设置一个观察点,当变量被读出或写入时程序被暂设置一个观察点,当变量被读出或

48、写入时程序被暂停停rwatch+变量变量设置一个观察点,当变量被程序读时,程序被暂停设置一个观察点,当变量被程序读时,程序被暂停watch+变量变量同同awatch1.4.3 数据相关命令数据相关命令命命 令令 格格 式式作作 用用 display+表达式表达式该命令用于显示表达式的值,使用了该命令后,该命令用于显示表达式的值,使用了该命令后,每当程序运行到断点处都会显示表达式的值每当程序运行到断点处都会显示表达式的值 info display用于显示当前所有要显示值的表达式的有关情用于显示当前所有要显示值的表达式的有关情况况 delete+display编号编号用于删除一个要显示值的表达式,

49、调用这个命用于删除一个要显示值的表达式,调用这个命令删除一个表达式后,被删除的表达式将不被令删除一个表达式后,被删除的表达式将不被显示显示 disable+display编号编号使一个要显示的表达式暂时无效使一个要显示的表达式暂时无效 enable+display编号编号disable diplay的反操作的反操作 1.4.3 数据相关命令数据相关命令命命 令令 格格 式式作作 用用 undisplay+display编号编号用于结束某个表达式值的显示用于结束某个表达式值的显示 whatis+变量变量显示某个表达式的数据类型显示某个表达式的数据类型 print(p)+变量或表达式变量或表达式用

50、于打印变量或表达式的值用于打印变量或表达式的值 set+变量变量变量值变量值改变程序中一个变量的值改变程序中一个变量的值 1.4.4调试运行环境相关命令调试运行环境相关命令命命 令令 格格 式式作作 用用set args设置运行参数设置运行参数show args参看运行参数参看运行参数set width+数目数目设置设置GDB的行宽的行宽cd+工作目录工作目录切换工作目录切换工作目录run程序开始执行程序开始执行step(s)进入式(会进入到所调用的子函数中)单步执行进入式(会进入到所调用的子函数中)单步执行next(n)非进入式(不会进入到所调用的子函数中)单步执行非进入式(不会进入到所调用的子函数中)单步执行finish一直运行到函数返回一直运行到函数返回until+行数行数运行到函数某一行运行到函数某一行continue(c)执行到下一个断点或程序结束执行到下一个断点或程序结束return改变程序流程,直接结束当前函数,并将指定值返回改变程序流程,直接结束当前函数,并将指定值返回call+函数函数在当前位置执行所要运行的函数在当前位置执行所要运行的函数1.4.5堆栈相关命令堆栈相关命令命命 令令 格格 式式作作 用用backtrace或或bt用来打印栈侦指针,也可以在该命令后加上用来打印栈

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论