您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 《嵌入式Linux操作系统》3 嵌入式Linux编程环境
华清远见嵌入式学院:华清远见嵌入式学院:《嵌入式Linux操作系统》——第3章嵌入式Linux编程环境华清远见嵌入式学院:编程技术。本章内容比Linux编程方面的书籍简略得多,重点介绍常用的Linux编程工具和技巧。通过本章学习可以使读者快速掌握基本的Linux开发工具,为后续的嵌入式Linux开发打下基础。《嵌入式Linux操作系统》——第3章嵌入式Linux编程环境华清远见嵌入式学院:系统提供了一个完整的编辑器家族系列,如ed、ex、vi和emacs等。按功能它们可以分为两大类:行编辑器(ed、ex)和全屏幕编辑器(vi、emacs)。行编辑器每次只能对单行进行操作,使用起来很不方便。而全屏幕编辑器可以对整个屏幕进行编辑,用户编辑的文件直接显示在屏幕上,从而克服了行编辑的那种不直观的操作方式,便于用户学习和使用,具有强大的功能。vi是Linux系统的第一个全屏幕交互式编辑程序,它从诞生至今一直得到广大用户的青睐,历经数十年仍然是人们主要使用的文本编辑工具,足以见其生命力之强,而强大的生命力是其强大的功能带来的。由于大多数读者在此之前都已经用惯了Windows的word等编辑器,因此,在刚刚接触时总会或多或少不适应,但只要习惯之后,就能感受到它的方便与快捷。3.1.1vi的模式vi有3种模式,分别为命令行模式、插入模式及底行模式各模式的功能,下面具体进行介绍。(1)命令行模式用户在用vi编辑文件时,最初进入的为一般模式。在该模式中可以通过上下移动光标进行“删除字符”或“整行删除”等操作,也可以进行“复制”、“粘贴”等操作,但无法编辑文字。(2)插入模式只有在该模式下,用户才能进行文字编辑输入,用户课按[ESC]键回到命令行模式。(3)底行模式在该模式下,光标位于屏幕的底行。用户可以进行文件保存或退出操作,也可以设置编辑环境,如寻找字符串、列出行号等。3.1.2vi的基本流程(1)进入vi,即在命令行下键入vihello(文件名)。此时进入的是命令行模式,光标位于屏幕的上方,如图3.1所示。(2)在命令行模式下键入i进入到插入模式,如图3.2所示。可以看出,在屏幕底部显示有“插入”表示插入模式,在该模式下可以输入文字信息。《嵌入式Linux操作系统》——第3章嵌入式Linux编程环境华清远见嵌入式学院:插入模式《嵌入式Linux操作系统》——第3章嵌入式Linux编程环境华清远见嵌入式学院:(3)最后,在插入模式中,输入“Esc”,则当前模式转入命令行模式,并在底行行中输入“:wq”(存盘退出)进入底行模式,如图3.3所示。这样,就完成了一个简单的vi操作流程:命令行模式→插入模式→底行模式。由于vi在不同的模式下有不同的操作功能,因此,读者一定要时刻注意屏幕最下方的提示,分清所在的模式。图3.3进入Vi底行模式3.1.3vi的各模式功能键(1)命令行模式常见功能键如表3.1所示。表3.1vi命令行模式功能键目录目录内容I切换到插入模式,此时光标当于开始输入文件处A切换到插入模式,并从目前光标所在位置的下一个位置开始输入文字O切换到插入模式,且从行首开始插入新的一行[ctrl]+[b]屏幕往“后”翻动一页[ctrl]+[f]屏幕往“前”翻动一页[ctrl]+[u]屏幕往“后”翻动半页[ctrl]+[d]屏幕往“前”翻动半页0(数字0)光标移到本行的开头G光标移动到文章的最后《嵌入式Linux操作系统》——第3章嵌入式Linux编程环境华清远见嵌入式学院:行$移动到光标所在行的“行尾”nEnter光标向下移动n行/name在光标之后查找一个名为name的字符串?name在光标之前查找一个名为name的字符串X删除光标所在位置的“后面”一个字符续表目录目录内容X删除光标所在位置的“前面”一个字符dd删除光标所在行ndd从光标所在行开始向下删除n行yy复制光标所在行nyy复制光标所在行开始的向下n行p将缓冲区内的字符粘贴到光标所在位置(与yy搭配)U恢复前一个动作(2)插入模式的功能键只有一个,也就是Esc退出到命令行模式。(3)底行模式常见功能键如表3.2所示。表3.2vi底行模式功能键目录目录内容:w将编辑的文件保存到磁盘中:q退出Vi(系统对做过修改的文件会给出提示):q!强制退出Vi(对修改过的文件不作保存):wq存盘后退出:w[filename]另存一个命为filename的文件:setnu显示行号,设定之后,会在每一行的前面显示对应行号:setnonu取消行号显示3.2gcc编译器GNUCC(简称为Gcc)是GNU项目中符合ANSIC标准的编译系统,能够编译用C、C++和ObjectC等语言编写的程序。gcc不仅功能强大,而且可以编译如C、C++、ObjectC、Java、Fortran、Pascal、Modula-3和Ada等多种语言,而且gcc又是一个交叉平台编译器,它能够在当前CPU平台上为多种不同体系结构的硬件平台开《嵌入式Linux操作系统》——第3章嵌入式Linux编程环境华清远见嵌入式学院:发软件,因此尤其适合在嵌入式领域的开发编译。本章中的示例,除非特别注明,否则均采用gcc版本为4.0.0。下表3.3是gcc支持编译源文件的后缀及其解释。表3.3Gcc所支持后缀名解释后缀名所对应的语言后缀名所对应的语言.cC原始程序.s/.S汇编语言原始程序.C/.cc/.cxxC++原始程序.h预处理文件(头文件).mObjective-C原始程序.o目标文件.i已经过预处理的C原始程序.a/.so编译后的库文件.ii已经过预处理的C++原始程序3.2.1gcc编译流程解析如本章开头提到的,gcc的编译流程分为了4个步骤,分别为:•预处理(Pre-Processing);•编译(Compiling);•汇编(Assembling);•链接(Linking)。下面就具体来查看一下gcc是如何完成4个步骤的。首先,有以下hello.c源代码:#includestdio.hintmain(){printf(Hello!Thisisourembeddedworld!\n);return0;}(1)预处理阶段在该阶段,编译器将上述代码中的stdio.h编译进来,并且用户可以使用gcc的选项“-E”进行查看,该选项的作用是让gcc在预处理结束后停止编译过程。[root@localhostGcc]#gcc–Ehello.c–ohello.i在此处,选项“-o”是指目标文件,由表3.3可知,“.i”文件为已经过预处理的C原始程序。以下列出了hello.i文件的部分内容:typedefint(*__gconv_trans_fct)(struct__gconv_step*,struct__gconv_step_data*,void*,__constunsignedchar*,__constunsignedchar**,《嵌入式Linux操作系统》——第3章嵌入式Linux编程环境华清远见嵌入式学院:*,unsignedchar**,size_t*);…#2hello.c2intmain(){printf(Hello!Thisisourembeddedworld!\n);return0;}由此可见,Gcc确实进行了预处理,它把“stdio.h”的内容插入到hello.i文件中。(2)编译阶段接下来进行的是编译阶段,在这个阶段中,gcc首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc把代码翻译成汇编语言。用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。[root@localhostGcc]#gcc–Shello.i–ohello.s以下列出了hello.s的内容,可见gcc已经将其转化为汇编了,感兴趣的读者可以分析一下这一行简单的C语言小程序是如何用汇编代码实现的。.filehello.c.section.rodata.align4.LC0:.stringHello!Thisisourembeddedworld!.text.globlmain.typemain,@functionmain:pushl%ebpmovl%esp,%ebpsubl$8,%espandl$-16,%espmovl$0,%eaxaddl$15,%eaxaddl$15,%eaxshrl$4,%eaxsall$4,%eax《嵌入式Linux操作系统》——第3章嵌入式Linux编程环境华清远见嵌入式学院::(GNU)4.0.020050519(RedHat4.0.0-8).section.note.GNU-stack,,@progbits(3)汇编阶段汇编阶段是把编译阶段生成的“.s”文件转成目标文件,读者在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了。如下所示:[root@localhostGcc]#gcc–chello.s–ohello.o(4)链接阶段在成功编译之后,就进入了链接阶段。在这里涉及到一个重要的概念:函数库。读者可以重新查看这个小程序,在这个程序中并没有定义“printf”的函数实现,且在预编译中包含进的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实现“printf”函数的呢?最后的答案是:系统把这些函数实现都被做到名为libc.so.6的库文件中去了,在没有特别指定时,gcc会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到libc.so.6库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用。函数库一般分为静态库和动态库两种。静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“.a”。动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”,如前面所述的libc.so.6就是动态库。gcc在编译时默认使用动态库。完成了链接之后,gcc就可以生成可执行文件,如下所示。[root@localhostGcc]#gcchello.o–ohello运行该可执行文件,出现正确的结果如下。[root@localhostGcc]#./helloHello!Thisisourembeddedworld!3.2.2gcc编译选项分析《嵌入式Linux操作系统》——第3章嵌入式Linux编程环境华清远见嵌入式学院:个的可用选项,主要包括总体选项、告警和出错选项、优化选项和体系结构相关选项。以下对每一类中最常用的选项进行讲解。(1)总体选项gcc的总结选项如表3.4所示,很多在前面的示例中已经有所涉及。表3.4gcc总体选项列表后缀名所对应的语言-c只是编译不链接,生成目标文件“.o”-S只是编译不汇编,生成汇编代码-E只进行预编译,不做其他处理-g在可执行程序中包含标准调试信息-ofile把输出文件输出到file里-v打印出编译器内部编译各过程的命令行信息和编译器的
本文标题:《嵌入式Linux操作系统》3 嵌入式Linux编程环境
链接地址:https://www.777doc.com/doc-4420860 .html