《嵌入式linuxC语言开发工具.ppt》由会员分享,可在线阅读,更多相关《嵌入式linuxC语言开发工具.ppt(63页珍藏版)》请在三一办公上搜索。
1、嵌入式应用程序设计第二章 嵌入式Linux C语言程序开发工具,2,2.1嵌入式Linux下C语言概述 2.2 编辑器vim 2.3 编译器gcc 2.4 调试器GDB2.5 make工程管理器 2.6 autotools(不讲)2.7小结,本章课程:,3,2.1嵌入式Linux下C语言概述,嵌入式Linux程序设计以C语言为主体,还涉及到shell编程,php/python脚本编程等C语言最早是由贝尔实验室的Dennis Ritchie为了UNIX的辅助开发而编写的,它是在B语言的基础上开发出来的。尽管语言不是专门针对UNIX操作系统或机器编写的,但它与UNIX系统的关系十分紧密。由于它的硬
2、件无关性和可移植性,使C语言逐渐成为世界上使用最广泛计算机语言。ANSI C标准,流行的C语言编译系统以它为基础,4,2.1 嵌入式Linux下C语言概述,C语言有如下特点:C语言是“中级语言”。它把高级语言的基本结构和语句与低级语言的实用性结合起来。可以像汇编语言一样对位、字节和地址进行操作。C语言是结构化的语言。C语言功能齐全。指针支持。C语言可移植性强。,5,2.1嵌入式Linux下C语言概述,嵌入式Linux C程序开发环境编辑器(vim)编译链接器(gcc)词法、语法和语义分析,中间代码的生成与优化,符号表管理,出错处理等调试器(gdb)项目管理工具(Make)自动化控制与管理编译过
3、程,使程序员将精力集中在代码编写上善于调试代码,解决Bug是优秀程序员的必备能力,6,2.2 编辑器vim,2.2.1 vi的基本模式2.2.2 vi的基本操作,7,2.2.1 vi的基本模式,标准模式(Normal mode)通常进入vim后默认处于标准模式(或者称为命令模式)。在此模式下任何键盘的输入都是作为命令来对待。命令的输入通常是不回显的,只显示执行的结果。插入模式(Insert Mode)用户只有在插入模式下才可以进行字符输入,用户按Esc键可回到命令行模式下。命令行模式(Command-line mode)在此模式下,用户可以将文件保存或退出vim,也可以设置编辑环境,如寻找字符
4、串、列出行号等。可视模式(Visual mode)在此模式下,通过移动光标选择文本,选中的文本将反白显示,这样提供高效、直观的编辑功能。用户按下ESC键可回到命令行模式。,8,2.2.2 vi的基本操作,1.vim的进入、保存和退出进入vim可以直接在命令终端下键入vim 文件名,vim可以自动载入所要编辑的文件或是开启一个新的文件。如在shell中键入vim hello.c(新建文件)则可进入vim环境。进入vi后屏幕左方会出现波浪符号,凡是具有该符号就代表此列目前是空的。此时进入的是命令行模式。要退出vim可以在命令行模式下键入“:q”(不保存并退出)或“:q!”(不保存并强制退出)或“:
5、wq”(保存并退出)指令则是保存之后再离开(注意冒号)。,9,2.2.2 vi的基本操作,10,2.2.2 vi的基本操作,2.光标的移动除了使用标准光标键移动光标之外,vim还提供了很多复杂的光标移动方式。,11,2.2.2 vi的基本操作,3.文本编辑 文本编辑包括输入、修改、复制、粘贴、删除(可以用Del键和Backspace键)和恢复等操作。,12,2.2.2 vi的基本操作,4.查找与替换vim的查找和替换功能都支持正则表达式,可以匹配非常复杂的关键字,功能非常强大。,13,Vim的使用技巧重在积累,14,2.3 编译器gcc,2.3.1 GCC的简介2.3.2 GCC的编译流程2.
6、3.3 GCC的常用编译选项,15,2.3.1 GCC的简介,GNU CC(简称为gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C+和Object C等语言编写的程序。gcc不仅功能强大,而且可以编译如C、C+、Object C、Java、Fortran、Pascal、Modula-3和Ada等多种语言gcc又是一个交叉平台编译器,支持的硬件平台很多,如alpha、arm、avr、hppa、i386、m68k、mips、powerpc、sparc、vxworks、x86_64、MS Windows、OS/2等等。它能够在当前CPU平台上为多种不同体系结构的硬件平台开发软件
7、,因此尤其适合在嵌入式领域的开发编译。,16,2.3.1 GCC的简介,gcc的编译流程分为了4个步骤,分别为:预处理(Pre-Processing)编译(Compiling)汇编(Assembling)链接(Linking),17,18,2.3.1 GCC的简介,GCC使用的基本语法为:gcc option|filename,19,2.3.2 GCC的编译流程,预处理阶段处理的主要作用是通过预处理的内建功能对一些可预处理资源进行等价替换,最常见的可预处理资源有:文件包含、条件编译、布局控制和宏处理等。,20,文件包含:#include是最为常见的预处理,主要将指定的文件代码组合到源程序代码之
8、中。条件编译:#if、#ifdef、#ifndef、#if defined、#endif、#undef等也是常用的预处理,主要是在编译时进行选择性编译,有效地控制版本和编译范围,防止对文件的重复包含等重要功能。布局控制:#progma功能因后面的参数不同而不同,例如 使用#progma pack(1)可以内存变量的1个字节对齐,使得结构变量的成员分配到连续的内存块,等价于_attribute_(packed)。宏替换:#define的主要功能是定义符号常量、函数功能、重新命名、字符串符号的拼接等各种功能。其他的预处理有:#line是用于修改预定义宏_LINE_(当前所在的行号)和_FILE_(
9、当前源文件的文件名);#error/#warning分别用于输出一个错误/警告信息;等等。,21,gcc的选项“-E”可以使编译器在预处理结束时就停止编译,选项“-o”是指定GCC输出的结果,其命令格式为如下所示。gcc E o 目标文件 编译文件例如:$gcc E o hello.i hello.c查看hello.i,分析宏处理,22,2.3.2 GCC的编译流程,编译阶段 编译器在预处理结束之后,gcc首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,就开始把代码翻译成汇编语言,gcc的选项“-S”能使编译器在进行汇编之前就停止。由表2.6可知,“.s”是
10、汇编语言原始程序,因此,此处的目标文件就可设为“.s”类型。$gcc S o hello.s hello.i,23,2.3.2 GCC的编译流程,汇编阶段汇编阶段是把编译阶段生成的“.s”文件生成目标文件,读者在此使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了。如下所示。$gcc c hello.s o hello.o,24,2.3.2 GCC的编译流程,链接阶段。完成了链接之后,gcc就可以生成可执行文件,其命令如下所示。$gcc hello.o o hello运行该可执行文件,出现正确的结果。$./hellohello,embedded world库函数printf的实
11、现在中最简单的程序也用到了系统函数库(C运行时库)理解这个编译的过程是撰写Makefile的基础,25,2.3.3 gcc的常用编译选项,gcc有超过100个的可用选项,包括总体选项、警告和出错选项、优化选项和体系结构等相关选项。(1)常用选项,26,-I的理解改为:#include“my.h”,27,2.3.3 gcc的常用编译选项,(2)库相关选项,28,使用函数库作为程序模块,动态库重用性强,升级方便函数库能够节省内存和存储器的资源静态库(.a后缀)是一系列的目标文件的归档,静态链接时,静态库中的目标文件会被复制到程序的可执行文件中去动态库()不具有“复制”操作,程序运行时载入。动态库可
12、以实现共享,也称为共享库,易于升级,29,静态库例子动态库例子动态库的搜索路径,LD_LIBRARY_PATH环境变量,/etc/软件依赖库,xxx-devel.rpm,包含了头文件和库文件理解-I,-L非常重要,30,2.3.3 gcc的常用编译选项,(3)警告和出错选项,31,写代码过程中,消除所有警告,保证代码规范,32,2.3.3 gcc的常用编译选项,(4)优化选项gcc可以对代码进行优化,它通过编译选项“-On”来控制优化代码的生成,其中n是一个代表优化级别的整数。对于不同版本的gcc来讲,n的取值范围及其对应的优化效果可能并不完全相同,比较典型的范围是从0变化到2或3开发调试过程
13、中,关闭优化 产品最终发行时,开启优化,33,2.3.3 gcc的常用编译选项,(5)体系结构相关选项,34,2.4 调试器GDB,GDB是GNU开源组织发布的一个强大的Linux下的程序调试工具,它是一种强大的命令行调试工具。一个合格的调试器需要有以下几项基本功能。能够运行程序,设置所有能影响程序运行的参数。能够让程序让指定的条件下停止。能够在程序停止时检查所有参数的情况。能够根据指定条件改变程序的运行。Debug是一门艺术,35,2.4.1 gdb使用流程,进入GDB gdb test 查看文件l设置断点 b 6 查看断点处情况 info b 运行代码 r 查看变量值 p n/p i单步运
14、行 n恢复程序运行 c观察变量 watch n 退出GDB q,36,例子,37,2.4.2 gdb基本命令,1工作环境相关命令,38,2.4.2 gdb基本命令,2设置断点与恢复命令,39,2.4.2 gdb基本命令,3gdb中源码查看相关命令,40,2.4.2 gdb基本命令,4gdb中查看运行数据相关命令,41,f ormat:x,u,d,o,s,Size(单位)u,b,h,w,g,42,2.4.2 gdb基本命令,5gdb中修改运行参数相关命令gdb还可以修改运行时的参数,并使该变量按照用户当前输入的值继续运行。它的设置方法为:在单步执行的过程中,键入命令“set 变量设定值”。,43
15、,2.4.3 gdbserver远程调试,使用交叉调试工具实现远程调试。gdb调试器提供了两种不同的远程调试方法,即stub(插桩)方式和gdbserver方式。gdbserver本身的体积很小,能够在具有很小内存的目标系统上独立运行,因而非常适合嵌入式开发。stub方式则需要通过链接器把调试代理和要调试的程序链接成一个可执行的应用程序文件,而且stub需要修改异常处理和驱动程序等。gdbserver要求宿主机和目标系统采用同一系列的操作系统,而stub没有这种限制,甚至目标系统可以没有操作系统。gdbserver比较适合于调试嵌入式平台上的应用程序,而stub比较适合于调试bootloade
16、r和内核等系统程序。,44,2.4.3 gdbserver远程调试,用gdb+gdbserver的方式调试嵌入式平台上的Linux应用程序 安装arm-linux-gdb安装gdbserver 远程调试上机过程中演示讲解,45,2.5 make工程管理器,2.5.1 Makefile基本结构 2.5.2 Makefile变量 2.5.3 Makefile规则 2.5.4 make管理器的使用,46,大的代码量(*.c,*.h)希望有一个方法,可以自动识别发生更新的文件,避免输入繁琐的命令来完成编译让程序员把注意力放在“代码本身”,而不是“编译代码”上,47,2.5.1 Makefile基本结构
17、,在一个Makefile中通常包含如下内容。需要由make工具创建的目标体(target),目标体通常是目标文件、可执行文件或是一个标签。要创建的目标体所依赖的文件(dependency_file)。创建每个目标体时需要运行的命令(command)。它的格式为:target:dependency_files commandcommand必须与Tab键开头执行make与make target_nameMakefile 与 makefile,48,P43的例子分析依赖关系,49,Makefile中的变量自定义变量预定义变量自动变量环境变量变量名变量名能包含“:”“#”“=”如何引用变量名“=”与“
18、:=”,50,2.5.2 Makefile变量,Makefile中常见预定义变量,51,2.5.2 Makefile变量,Makefile中常见自动变量,52,2.5.3 Makefile规则,隐式规则 隐含规则能够告诉make怎样使用传统的技术完成任务,这样,当用户使用它们时就不必详细指定编译的具体细节,而只需把目标文件列出即可。make会自动搜索隐式规则目录来确定如何生成目标文件。make的隐式规则指出:所有“.o”文件都可自动由“.c”文件使用命令“$(CC)$(CPPFLAGS)$(CFLAGS)-c file.c o file.o”生成。,53,2.5.3 Makefile规则,隐式
19、规则,Makefile中常见隐式规则目录,一个.c 对应 一个.h,54,2.5.3 Makefile规则,模式规则 模式规则不同于隐式规则,是用来定义相同处理规则的多个文件的,模式规则能引入用户自定义变量,为多个文件建立相同的规则,简化Makefile的编写。模式规则的格式类似于普通规则,这个规则中的相关文件前必须用“%”标明。,OBJS=kang.o yul.oCC=gccCFLAGS=-Wall-O-gdavid:$(OBJS)$(CC)$-o$%.o:%.c$(CC)$(CFLAGS)-c$-o$,55,2.5.4 make使用,56,Iptraf软件的Makefile,57,在网上查
20、询一下,如何写一个智能的Makefile,添加一个.c文件与.h文件,无需编辑Makefile用Make管理大型项目是比较复杂的,支持协同开发Shell脚本环境变量,58,Linux下的GNU软件大都用autotools来制作Makefile自己动手编译一个软件源代码解压./configure收集系统信息,定制配置(./configure help)生成Makefileconfig.log,config.hmakemake installmake cleanmake dist,59,2.7 实验内容,2.7.1 vim使用练习2.7.2 用gdb调试程序的bug2.7.3 编写包含多文件的ma
21、kefile,60,2.7.1 vim使用练习,实验目的通过指定指令的vim操作练习,使读者能够熟练使用vim中的常见操作,并且熟悉vim的几种模式,如果读者能够熟练掌握实验内容中所要求的内容,则表明对vim的操作已经很熟练了。实验内容,(11)将光标移动到最后一行的行尾。(12)粘贴复制行的内容。(13)光标移到“si:sysinit:/etc/rc.d/rc.sysinit”。(14)删除该行。(15)存盘但不退出。(16)将光标移到首行。(17)插入模式下输入“Hello,this is vi world!”。(18)返回命令行模式。(19)向下查找字符串“0:wait”。(20)再向上
22、查找字符串“halt”。(21)强制退出vim,不存盘。,(1)在“/root”目录下建一个名为“vim”的目录。(2)进入“vim”目录。(3)将文件“/etc/inittab”复制到“vim”目录下。(4)使用vim打开“vim”目录下的inittab。(5)设定行号,指出设定initdefault(类似于“id:5:initdefault”)的所在行号。(6)将光标移到该行。(7)复制该行内容。(8)将光标移到最后一行行首。(9)粘贴复制行的内容。(10)撤销第9步的动作。,分别指出每个命令处于何种模式下?,61,2.7.2 用gdb调试程序的bug,实验目的通过调试一个有问题的程序,使
23、读者进一步熟练使用vi操作,而且熟练掌握gcc编译命令及gdb的调试命令,通过对有问题程序的跟踪调试,进一步提高发现问题和解决问题的能力。这是一个很小的程序,希望读者认真调试。实验内容(1)使用vi编辑器,将以下代码输入到名为greet.c的文件中。(2)使用gcc编译这段代码,注意要加上“-g”选项以方便之后的调试。(3)运行生成的可执行文件,观察运行结果。(4)使用gdb调试程序,通过设置断点、单步跟踪,一步步找出错误所在。(5)纠正错误,更改源程序并得到正确的结果。,62,2.7.3 编写包含多文件的makefile,实验目的通过对包含多文件的makefile的编写,熟悉各种形式的mak
24、efile,并且进一步加深对makefile中用户自定义变量、自动变量及预定义变量的理解。实验内容(1)用vi在同一目录下编辑两个简单的hello程序(2)仍在同一目录下用vim编辑makefile,且不使用变量替换,用一个目标体实现(即直接将hello.c和hello.h编译成hello目标体)。然后用make验证所编写的makefile是否正确。(3)将上述makefile使用变量替换实现。同样用make验证所编写的makefile是否正确。(4)编辑另一个makefile,取名为makefile1,不使用变量替换,但用两个目标体实现(也就是首先将hello.c和hello.h编译为hel
25、lo.o,再将hello.o编译为hello),再用make的“-f”选项验证这个makefile1的正确性。(5)将上述makefile1使用变量替换实现。,63,2.8 本章小结,本章是Linux中C语言编程开发的基础,首先讲解了Linux平台下C语言编程的基本概念。接下来,本章介绍了Linux中常见的编辑器vim,并且主要讲解vim的4种模式和基本操作。再接下来,本章介绍了gcc编译器的使用、函数库的创建与使用以及gdb的本地/远程调试的方法,并结合具体的实例进行讲解。虽然它们的选项比较多,但是常用的并不多,读者着重掌握笔者例子中使用的一些选项即可。之后,本章又介绍了make工程管理器的使用,这里包括makefile的基本结构、makefile的变量定义及其规则和make的使用。后面讲解常用的集成开发环境Eclipse的安装和使用方法。最后介绍的是makefile的自动生成器autotools的使用。本章的实验包括了vim、gcc、gdb、makefile、autotool的使用,由于这些都是Linux中的常用软件,因此希望读者切实掌握。,
链接地址:https://www.31ppt.com/p-6569740.html