本章将带领读者学习在linux中进行c语言编程的基本技能。学习了本章后,读者能够掌握如下内容。
熟悉linux系统下的开发环境。
熟悉vi的基本操作。
熟练emacs的基本操作。
熟悉gcc编译器的基本原理。
熟练使用gcc编译器的常用选项。
熟练使用gdb的调试技术。
熟悉makefile基本原理及语法规范。
熟练使用autoconf和automake生成makefile
3.1.1. c语言简单回顾。
由于c语言的硬件无关性和可移植性,使c语言逐渐成为世界上使用最广泛的计算机语言。为了进一步规范c 语言的硬件无关性,1987 年,美国国家标准协会(ansi)根据c 语言问世以来各种版本对c 语言的发展和扩充,制定了新的标准,称为ansi c。ansi c 语言比原来的标准c 语言有了很大的发展。
目前流行的c 语言编译系统都是以它为基础的。
c语言有如下特点:
c语言是“中级语言”:它把高级语言的基本结构和语句与低级语言的实用性结合起来。c语言可以像汇编语言一样对位、字节和地址进行操作。
c语言是结构化的语言:这种结构化方式可使程序层次清晰,便于使用、维护以及调试。
c语言功能齐全:。c语言具有各种各样的数据类型,并引入了指针的概念,可使程序效率更高。
c语言可移植性强:c语言适合多种操作系统,如dos、windows、linux,也适合多种体系结构,因此尤其适合在嵌入式领域的开发。
3.1.2. linux下c语言编程环境概述。
linux下的c语言程序设计与在其他环境中的c程序设计一样,主要涉及编辑器、编译链接器、调试器及项目管理工具。
1)编辑器。
linux 下的编辑器就如windows下的记事本、写字板等一样,完成对所录入文字的编辑功能。linux 中最常用的编辑器有vi(vim)和emacs,它们功能强大、使用方便,深受编程爱好者的喜爱。在本书中,着重介绍vi 和emacs。
2)编译链接器。
编译是指源**转化生成可执行**的过程,它所完成的主要工作如图3-1 所示。可见,编译过程是非常复杂的,它包括词法、语法和语义的分析、中间**的生成和优化、符号表的管理和出错处理等。在linux中,最常用的编译器是gcc编译器。
它是gnu 推出的功能强大、性能优越的多平台编译器,其执行效率与一般的编译器相比平均效率要高20%~30%。
图3-1 编译过程。
3)调试器。
调试器并不是**执行的必备工具,而是专为方便程序员调试程序而用的。有编程经验的读者都知道,在编程的过程当中,往往调试所消耗的时间远远大于编写**的时间。因此,有一个功能强大、使用方便的调试器是必不可少的。
gdb 是绝大多数linux 开发人员所使用的调试器,它可以方便地设置断点、单步跟踪等,足以满足开发人员的需要。
4)项目管理器。
linux 中的项目管理器“make”有些类似于windows 中visual c++里的“工程”,它是一种控制编译或者重复编译软件的工具,另外,它还能自动管理软件编译的内容、方式和时机,使程序员能够把精力集中在**的编写上而不是在源**的组织上。
linux 系统提供了一个完整的编辑器家族系列,如ed、ex、vi 和emacs 等。按功能它们可以分为两大类:行编辑器(ed、ex)和全屏幕编辑器(vi、emacs)。
行编辑器每次只能对一行进行操作,使用起来很不方便。而全屏幕编辑器可以对整个屏幕进行编辑,用户编辑的文件直接显示在屏幕上,从而克服了行编辑那种不直观的操作方式,便于用户学习和使用,具有强大的功能。
vi 是linux 系统的第一个全屏幕交互式编辑程序,它从诞生至今一直得到广大用户的青睐,历经数十年仍然是人们主要使用的文本编辑工具,足以见其生命力之强,而强大的生命力是其强大的功能带来的。由于大多数读者在此之前都已经用惯了windows 平台上的编辑器,因此,在刚刚接触时总会或多或少不适应,但只要习惯之后,就能感受到它的方便与快捷。
1.vi的模式。
vi 有3 种模式,分别为命令行模式、插入模式及命令行模式。下面具体介绍各模式的功能。
1)命令行模式。
用户在用vi 编辑文件时,最初进入的为一般模式。在该模式中用户可以通过上下移动光标进行“删除字符”或“整行删除”等操作,也可以进行“复制”、“粘贴”等操作,但无法编辑文字。
2)插入模式。
只有在该模式下,用户才能进行文字编辑输入,用户按[esc]可键回到命令行模式。
3)底行模式。
在该模式下,光标位于屏幕的底行。用户可以进行文件保存或退出操作,也可以设置编辑环境,如寻找字符串、列出行号等。
2.vi的基本流程。
1)进入vi,即在命令行下键入“vi hello”(文件名)。此时进入的是命令行模式,光标位于屏幕的上方,如图3.2 所示。
(2)在命令行模式下键入i 进入插入模式,如图3.3 所示。可以看出,在屏幕底部显示有“插入”表示插入模式中的输入状态,在该模式下可以输入文字信息。
3)最后,在插入模式中,按“esc”键,则当前模式转入命令行模式,并在底行行中输入“:wq”(存盘退出)进入底行模式,这样,就完成了一个简单的vi操作流程:命令行模式→插入模式→底行模式。
由于vi在不同的模式下有不同的操作功能,因此,读者一定要时刻注意屏幕最下方的提示,分清所在的模式。
3.vi的各模式功能键。
2.vi的基本流程。
1)进入vi,即在命令行下键入“vi hello”(文件名)。此时进入的是命令行模式,光标位于屏幕的上方。
2)在命令行模式下键入i 进入插入模式,如图3.3 所示。可以看出,在屏幕底部显示有“插入”表示插入模式中的输入状态,在该模式下可以输入文字信息。
3)最后,在插入模式中,按“esc”键,则当前模式转入命令行模式,并在底行行中输入“:wq”(存盘退出)进入底行模式,如图3.4 所示。
这样,就完成了一个简单的vi操作流程:命令行模式→插入模式→底行模式。由于vi在不同的模式下有不同的操作功能,因此,读者一定要时刻注意屏幕最下方的提示,分清所在的模式。
3.vi的各模式功能键。
1)命令行模式常见功能键。
i 切换到插入模式,在目前的光标所在处插入输入的文字,已存在的文字会向后退。
a 切换到插入模式,并从目前光标所在位置的下一个位置开始输入文字。
o 切换到插入模式,且从行首开始插入新的一行。
0(数字0) 光标移到本行的开头。
g 光标移动到文件的最后。
ng 光标移动到第n行。
移动到光标所在行的“行尾”
n 光标向下移动n行。
name 在光标之后查找一个名为name的字符串。
name 在光标之前查找一个名为name的字符串。
x 删除光标所在位置的一个字符。
x 删除光标所在位置的前一个字符。
dd 删除光标所在行。
ndd 从光标所在行开始向下删除n行。
yy 复制光标所在行。
nyy 复制光标所在行开始的向下n行。
p 将缓冲区内的字符粘贴到光标所在位置(与yy搭配)
u 恢复前一个动作。
2)插入模式的功能键只有一个,即按“esc”键可回到命令行模式。
3)底行模式常见功能键如表3.2 所示。
w 将编辑的文件保存到磁盘中。
q 退出vi(系统对做过修改的文件会给出提示)
q! 强制退出vi(对修改过的文件不作保存)
wq 存盘后退出。
w [filename] 另存一个名为filename的文件。
set nu 显示行号,设定之后,会在每一行的前面显示对应行号。
set nonu 取消行号显示。
gnu cc(简称为gcc)是gnu项目中符合ansi c标准的编译系统,能够编译。
用c、c++和object c等语言编写的程序。gcc 不仅功能强大,而且可以编译如c、c++、object c、j**a、fortran、pascal、modula-3和ada 等多种语言,而且gcc是一个交叉平台编译器,它能够在当前cpu 平台上为多种不同体系结构的硬件平台开发软件,因此尤其适合在嵌入式领域的开发编译。
gcc支持编译源文件的后缀及其解释:
.c c原始程序 .s/.s 汇编语言原始程序。
c/.cc/.cxx c++原始程序 .h 预处理文件(头文件)
m objective-c原始程序 .o 目标文件。
i 已经过预处理的c原始程序 .a/.so 编译后的库文件。
ii 已经过预处理的c++原始程序 …
如本章开头提到的,gcc的编译流程分为了4 个步骤,分别为:
预处理(pre-processing);
编译(compiling);
汇编(assembling);
链接(linking)。
下面就具体来查看一下gcc是如何完成以上4 个步骤的。首先看一下的源**:
#include <>
int main()
printf("hello! this is our embedded world!");
return 0;
1)预处理阶段。
在该阶段,对包含的头文件(#include)和宏定义(#define、#ifdef等)进行处理。在上述**的预处理过程中,编译器将包含的头文件编译进来,并且用户可以使用gcc 的选项“-e”进行查看,该选项的作用是让gcc 在预处理结束后停止编译过程。
root@localhost gcc]# gcc –e –o
在此处,选项“-o”是指目标文件,由表3.6 可知,“.i”文件为已经过预处理的c程序。以下列出了文件的部分内容:
typedef int (*gconv_trans_fct) (struct __gconv_step *,struct __gconv_step_data *,void *,const unsigned char *,const unsigned char **const unsigned char *,unsigned char **size_t *)#
第3章linux
为。现代linux系统进行软件开发时,软件和硬件的可移植性是需要考虑的一个非常重要的问题。但可移植性究竟意味着什么?你如何才能实现软件预期的灵活性,这些问题常常困扰着开发人员。本章的目的就是为了解决在使用linux时普遍面临的各种硬件和软件可移植性问题。本章大致被分为两部分。前半部分介绍纯软件的可移...
会计基础第3章
第3章练习。单选题。1 存在对应关系的科目称为 a 总分类科目。b 联系科目。c 明细类科目。d 对应科目。答案d2 权益类科目的余额一般在 a 无余额。b 借方。c 借方或贷方。d 贷方。答案d3 某企业所有者权益总额为6000万元,负债总额为4000万元。那么该企业的资产总额为 万元。a 600...
会计基础第3章答案
1.解答 1 业务1 企业购买原材料一批,价款计45 000元 假设不考虑增值税 通过银行支付货款15 000元,其余30 000元暂未支付。业务2 企业收回客户所欠本企业的货款12 000元,存入银行。业务3 本企业接受投资者投资计510 000元,其中一台全新设备价值276 000元,设备交付使...