《嵌入式LINUX应用程序开发详解》作者:华清远见第3章Linux下的C编程基础本章目标在熟悉了Linux常见命令,能够在Linux中熟练操作之后,本章将带领读者学习在Linux中进行C语言编程的基本技能。学习了本章后,读者能够掌握如下内容。熟悉Linux系统下的开发环境熟悉Vi的基本操作熟练Emacs的基本操作熟悉Gcc编译器的基本原理熟练使用Gcc编译器的常用选项熟练使用Gdb调试技术熟悉Makefile基本原理及语法规范熟练使用autoconf和automake来生成Makefile专业始于专注卓识源于远见 ‐ 2 ‐ 3.1Linux下C语言编程概述3.1.1C语言简单回顾C语言昀早是由贝尔实验室的DennisRitchie为了UNIX的辅助开发而编写的,它是在B语言的基础上开发出来的。尽管C语言不是专门针对UNIX操作系统或机器编写的,但它与UNIX系统的关系十分紧密。由于它的硬件无关性和可移植性,使C语言逐渐成为世界上使用昀广泛计算机语言。为了进一步规范C语言的硬件无关性,1987年,美国国家标准协会(ANSI)根据C语言问世以来各种版本对C语言的发展和扩充,制定了新的标准,称为ANSIC。ANSIC语言比原来的标准C语言有了很大的发展。目前流行的C语言编译系统都是以它为基础的。C语言的成功并不是偶然的,它强大的功能和它的可移植性让它能在各种硬件平台上游刃自如。总体而言,C语言有如下特点。C语言是“中级语言”。它把高级语言的基本结构和语句与低级语言的实用性结合起来。C语言可以像汇编语言一样对位、字节和地址进行操作,而这三者是计算机昀基本的工作单元。C语言是结构化的语言。C语言采用代码及数据分隔,使程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰,便于使用、维护以及调试。C语言是以函数形式提供给用户的,这些函数可方便地调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。C语言功能齐全。C语言具有各种各样的数据类型,并引入了指针概念,可使程序效率更高。另外,C语言也具有强大的图形功能,支持多种显示器和驱动器,而且计算功能、逻辑判断功能也比较强大,可以实现决策目的。C语言可移植性强。C语言适合多种操作系统,如DOS、Windows、Linux,也适合多种体系结构,因此尤其适合在嵌入式领域的开发。3.1.2Linux下C语言编程环境概述Linux下的C语言程序设计与在其他环境中的C程序设计一样,主要涉及到编辑器、编译链接器、调试器及项目管理工具。现在我们先对这4种工具进行简单介绍,后面会对其一一进行讲解。(1)编辑器Linux下的编辑器就如Windows下的word、记事本等一样,完成对所录入文字的编辑功能。Linux中昀常用的编辑器有Vi(Vim)和Emacs,图3.1编译过程专业始于专注卓识源于远见 ‐ 3 ‐ 它们功能强大,使用方便,广受编程爱好者的喜爱。在本书中,着重介绍Vi和Emacs。(2)编译链接器编译是指源代码转化生成可执行代码的过程,它所完成工作主要如图3.1所示。可见,在编译过程是非常复杂的,它包括词法、语法和语义的分析、中间代码的生成和优化、符号表的管理和出错处理等。在Linux中,昀常用的编译器是Gcc编译器。它是GNU推出的功能强大、性能优越的多平台编译器,其执行效率与一般的编译器相比平均效率要高20%~30%,堪称为GNU的代表作品之一。(3)调试器调试器并不是代码执行的必备工具,而是专为程序员方便调试程序而用的。有编程经验的读者都知道,在编程的过程当中,往往调试所消耗的时间远远大于编写代码的时间。因此,有一个功能强大、使用方便的调试器是必不可少的。Gdb是绝大多数Linux开发人员所使用的调试器,它可以方便地设置断点、单步跟踪等,足以满足开发人员的需要。(4)项目管理器Linux中的项目管理器“make”有些类似于Windows中VisualC++里的“工程”,它是一种控制编译或者重复编译软件的工具,另外,它还能自动管理软件编译的内容、方式和时机,使程序员能够把精力集中在代码的编写上而不是在源代码的组织上。3.2进入ViLinux系统提供了一个完整的编辑器家族系列,如Ed、Ex、Vi和Emacs等。按功能它们可以分为两大类:行编辑器(Ed、Ex)和全屏幕编辑器(Vi、Emacs)。行编辑器每次只能对一行进行操作,使用起来很不方便。而全屏幕编辑器可以对整个屏幕进行编辑,用户编辑的文件直接显示在屏幕上,从而克服了行编辑的那种不直观的操作方式,便于用户学习和使用,具有强大的功能。Vi是Linux系统的第一个全屏幕交互式编辑程序,它从诞生至今一直得到广大用户的青睐,历经数十年仍然是人们主要使用的文本编辑工具,足以见其生命力之强,而强大的生命力是其强大的功能带来的。由于大多数读者在此之前都已经用惯了Windows的word等编辑器,因此,在刚刚接触时总会或多或少不适应,但只要习惯之后,就能感受到它的方便与快捷。3.2.1Vi的模式Vi有3种模式,分别为命令行模式、插入模式及命令行模式各模式的功能,下面具体进行介绍。(1)命令行模式用户在用Vi编辑文件时,昀初进入的为一般模式。在该模式中可以通过上下移动光标进行“删除字符”或“整行删除”等操作,也可以进行“复制”、“粘贴”等操作,但无法编辑文字。(2)插入模式只有在该模式下,用户才能进行文字编辑输入,用户课按[ESC]键回到命令行模式。(3)底行模式在该模式下,光标位于屏幕的底行。用户可以进行文件保存或退出操作,也可以设置编辑环境,如寻找字符串、列出行号等。3.2.2Vi的基本流程(1)进入Vi,即在命令行下键入Vihello(文件名)。此时进入的是命令行模式,光标位于屏幕的上方,如图3.2所示。专业始于专注卓识源于远见 ‐ 4 ‐ (2)在命令行模式下键入i进入到插入模式,如图3.3所示。可以看出,在屏幕底部显示有“插入”表示插入模式,在该模式下可以输入文字信息。图3.2进入Vi命令行模式图3.3进入Vi插入模式(3)昀后,在插入模式中,输入“Esc”,则当前模式转入命令行模式,并在底行行中输入“:wq”(存盘退出)进入底行模式,如图3.4所示。这样,就完成了一个简单的Vi操作流程:命令行模式→插入模式→底行模式。由于Vi在不同的模式下有不同的操作功能,因此,读者一定要时刻注意屏幕昀下方的提示,分清所在的模式。专业始于专注卓识源于远见 ‐ 5 ‐ 图3.4进入Vi底行模式3.2.3Vi的各模式功能键(1)命令行模式常见功能键如表3.1所示。表3.1Vi命令行模式功能键目录目录内容I切换到插入模式,此时光标当于开始输入文件处A切换到插入模式,并从目前光标所在位置的下一个位置开始输入文字O切换到插入模式,且从行首开始插入新的一行[ctrl]+[b]屏幕往“后”翻动一页[ctrl]+[f]屏幕往“前”翻动一页[ctrl]+[u]屏幕往“后”翻动半页[ctrl]+[d]屏幕往“前”翻动半页0(数字0)光标移到本行的开头G光标移动到文章的昀后nG光标移动到第n行$移动到光标所在行的“行尾”nEnter光标向下移动n行/name在光标之后查找一个名为name的字符串?name在光标之前查找一个名为name的字符串X删除光标所在位置的“后面”一个字符X删除光标所在位置的“前面”一个字符专业始于专注卓识源于远见 ‐ 6 ‐ 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取消行号显示注意Vi的升级版Vim已经问世了,功能相当强大,且保持与Vi的90%相兼容,因此,感兴趣的读者可以查看相关资料进行学习。3.3初探Emacs正如前面所述,Vi是一款功能非常强大的编辑器,它能够方便、快捷、高效地完成用户的任务,那么,在此再次向读者介绍另一款编辑器是否多此一举呢?答案是否定的。因为Emacs不仅仅是一款功能强大的编译器,而且是一款融合编辑、编译、调试于一体的开发环境。虽然,它没有VisualSdiao一样绚丽的界面,但是它可以在没有图形显示的终端环境下出色的工作,相信追求强大功能和工作效率的任务并不会介意它朴素的界面的。Emacs的使用和Vi截然不同。在Emacs里,没有类似于Vi的3种“模式”。Emacs只有一种模式,也就是编辑模式,而且它的命令全靠功能键完成。因此,功能键也就相当重要了。但Emacs却还使用一个不同Vi的“模式”,它的“模式”是指各种辅助环境。比如,当编辑普通文本时,使用的是“文本模式(TxtMode)”,而当他们写程序时,使用的则是如“c模式”、“Shell模式”等。下面,首先来介绍一下Emacs中作为编辑器的使用方法,以帮助读者熟悉Emacs的环境。注释Emacs缩写注释:C-chr表示按住Ctrl键的同时键入字符chr。因此,C-f就表示按住Ctrl键同时键入f。M-chr表示当键入字符chr时同时按住Meta或Edit或Alt键(通常为Alt键)。3.3.1Emacs的基本操作1.Emacs安装 专业始于专注卓识源于远见 ‐ 7 ‐ 现在较新版本的Linux(如本书中所用的RedHatEnterprise4AS)的安装光盘中一般都自带有Emacs的安装包,用户可以通过安装光盘进行安装(一般在第2张光盘中)。2.启动Emacs 安装完Emacs之后,只需在命令行键入“emacs[文件名]”(若缺省文件名,也可在emacs编辑文件后另存时指定),也可从“编程”→“emacs”打开,3.5图中所示的就是从“编程”→“emacs”打开的Emacs欢迎界面。图3.5Emacs欢迎界面接着可单击任意键进入Emacs的工作窗口,如图3.6所示。从图中可见,Emacs的工作窗口分为上下两个部分,上部为编辑窗口,底部为命令显示窗口,用户执行功能键的功能都会在底部有相应的显示,有时也需要用户在底部窗口输入相应的命令,如查找字符串等。图3.6Emacs的工作窗口3.进入Emacs 专业始于专注卓识源于远见 ‐ 8 ‐ 在进入Emacs后,即可进行文件的编辑。由于Emacs只有一种编辑模式,因此用户无需进行模式间的切换。下面介绍Emacs中基本编辑功能键。(1)移动光标虽然在Emacs中可以使用“上”、“下”、“左”、“右”方向键来移动单个字符,但笔者还是建议读者学习其对应功能键,因为它们不仅能在所有类型的终端上工作,而且读者将会发现在熟练使用之后,输入这些Ctrl加字符会比按方向键快很多。下表3.3列举了Emacs中光标移动的常见功能键。表3.3Emacs光标移动功能键目录目录内容目录目录内容C-f向前移动一个字符M-b向后移动一个单词C-b向后移动一个字符C-a移动到行首C-p移动到上一行C-e移动到行尾C-n移动到下一行M-(M加“小于号”)移动光标到整个文本的开头M-f向前移动一个单词M-(M加“大于号”)移动光标到整个文本的末尾(2)剪切和粘贴在Emacs中可以使用“Delete”和“BackSpace”删除光标前后的字符,这和用户之前的习惯一致,在此就不赘述。以词和行为单位的剪切和粘贴功能键如表3.4所示。表3.4Emacs剪切和粘贴目录目录内容目录目录内容M-Delete剪切光标前面的单词M-k剪切从光标位置到句尾的内容M-d剪切光标前面的单词C-y将缓冲