第3章 Linux编程环境
本章内容包括常用的Linux开发工具使用技巧和 Linux编程技术。本章内容比Linux编程方面的书 籍简略得多,重点介绍常用的Linux编程工具和技 巧。通过本章学习可以使读者快速掌握基本的 Linux开发工具,为后续的嵌入式Linux开发打下 基础。 www.farsight.com.cn
本章目标 常用Linux编程工具 GNU工具链的使用技巧 Linux编程库的API介绍
3.1 Linux常用工具 3.1.1 Shell简介 在Linux系统开发过程中,开发者或者用户与Linux 系统(内核)进行交互的时候需要一个平台,这 就是Shell,有了它,用户就能通过键盘输入与系 统进行交互了。 单从字面意思上理解,Shell的本意是“壳”的意 思,通俗地讲就是内部核心与外部使用者发生联 系的介质。
Shell工作示意图
Shell提供了用户与操作系统之间通讯的方式。这 种通信可以以交互方式(从键盘输入,并且可以 立即得到响应),或者以Shell script(非交互)方 式执行。
3.1.2 常用Shell命令 1.Shell命令的一般格式 命令名 【选项】 【参数1】 【参数2】… 命令行输入实际上是可以编辑的一个文本缓冲区, 在命令行中就可以输入Shell命令了。在按“回车 键”以确认当前操作之前,可以对输入的内容进 行编辑。
2.命令行输入 命令行输入实际上是可以编辑的一个文本缓冲区 ,在命令行中就可以输入Shell命令了。在按“回 车键”以确认当前操作之前,可以对输入的内容 进行编辑。
3.常用Shell命令介绍 3.常用Shell命令介绍 (1)输入命令行自动补齐(automatic command line completion)功能 (2)对目录和文件的操作 (3)用户管理 (4)文件的打包和压缩 (5)rpm软件包的安装 (6)源码维护基本命令 diff命令 (7)配置、编译、安装源码包软件 (8)中断Shell命令执行的方法 (9)模块管理指令
3.1.3 编写Shell脚本 Shell不仅仅是命令的执行,而且是一种编程语言 ,它提供了定义变量和参数的手段以及丰富的程 序控制结构
1.建立脚本 编辑Shell脚本文件使用Linux下的普通编辑器如vi 、Emacs等即可。Linux下的Shell默认采用Bash, 所以本书也主要以Bash脚本为例介绍 2.Shell变量 Shell脚本中主要有以下几种变量:系统变量,环 境变量,用户变量
3.流程控制 同传统的编程语言一样,Shell提供了很多特性, 如数据变量、参数传递、判断、流程控制、数据 输入和输出、子程序及以中断处理等。 4.Shell脚本的执行 如果已经写好Shell脚本,运行该脚本可以有以下 的几种方法。 (1)设置好脚本的执行权限之后再执行脚本 (2)使用Bash内部指令"source" (3)直接使用sh命令来执行
3.1.4 正则表达式 正则表达式是一种可以用于模式匹配和替换的有 效工具。正则表达式描述了一种字符串匹配的模 式,可以用来检查一个串是否含有某种子串、将 匹配的子串做替换或者从某个串中取出符合某个 条件的子串等。 正则表达式由普通字符(例如字符a到z)以及特 殊字符(称为特殊字符)组成特定文字模式。当 从一个文件或命令中抽取或者过滤文本时,使用 正则表达式可以简化命令中的匹配表达。
3.1.5 程序编辑器 编辑器是系统的重要工具之一,在各种操作系统 中,编辑器都是必不可少的部件。Linux系统提供 了一个完整的编辑器家族系列,如Ed、Ex、Vi和 Emacs等,按功能它们可以分为两大类。 行编辑器(如Ed、Ex) 全屏幕编辑器(如Vi、Emacs)
Vi有3种基本工作模式:指令行模式、文本输入模 式、末行模式,它们的相互关系如下。
3.2 Makefile 3.2.1 GNU make GNU make最初是Unix系统下的一个工具,设计之 初是为了维护C程序文件不必要的重新编译,它是 一个自动生成和维护目标程序的工具。 make是一个解释Makefile文件中指令的命令工具, 其最基本的功能就是通过Makefile文件来描述源程 序之间的相互关系并自动维护编译工作,它会告 知系统以何种方式编译和链接程序。
通常状况之下GNU make的工作流程如下。 ① 查找当前目录下的Makefile文件 ② 初始化文件中的变量 ③ 分析Makefile中的所有规则 ④ 为所有的目标文件创建依赖关系 ⑤ 根据依赖关系,决定哪些目标文件要重新生成 ⑥ 执行生成命令
3.2.2 Makefile规则语法 Makefile有其自身特定的编写格式并且遵循一定的 语法规则。 #注释 目标文件:依赖文件列表 ............... <Tab>命令列表
3.2.3 Makefile文件中变量的使用 一般来说,Makefile文件中变量的应用主要有以下几个方面 。 1.代表一个文件列表 2.代表编译命令选项 所有编译命令都带有相同编译选项时(比如-Wall -O2等), 可以将该编译选项赋给一个变量,这样方便了引用。同时 ,如果改变编译选项的时候,只需改变该变量值即可,而 不必在每处用到编译选项的地方都做改动。
3.3 二进制代码工具的使用 3.3.1 GNU Binutils工具介绍 在Linux下建立嵌入式交叉编译环境要用到一系列的 工具链(tool-chain),主要有比如GNU Binutils、 Gcc、Glibc、Gdb等,它们都属于GNU的工具集。 GNU Binutils工具集里主要有以下一系列的部件。 as GNU的汇编器 ld GNU的链接器 add2line 将地址转换成文件名或行号对,以便调 试程序 ar 从文件中创建、修改、扩展文件 gasp 汇编宏处理器
nm 从目标代码文件中列举所有变量(包括变量值和变量类型),如果没有指 定目标文件,则默认是a.out文件 objcopy objcopy工具使用GNU BSD库,它可以把目标文件的内容从一种文件 格式复制到另一种格式的目标文件中 add2line 把程序地址转换为文件名和行号 objdump 显示目标文件信息 readelf 显示elf文件信息 ranlib 生成索引以加快对归档文件的访问,并将其保存到这个归档文件中 size 列出目标模块或文件的代码尺寸 strings 打印可打印的目标代码字符(至少4个字符),打印字符多少可以控制 strip 放弃所有符号连接 c++filt 链接器ld使用该命令可以过滤C++符号和Java符号,防止重载函数冲突 gprof 显示程序调用段的各种数据
3.3.2 Binutils工具软件使用 1.汇编器 Linux平台的标准汇编器是GAS,它是GCC所依赖的 后台汇编工具,通常包含在binutils 软件包中。 2.链接器 GNU链接器使用一个命令语言脚本来控制链接过程 。
3.4 编译器GCC的使用 3.4.1 GCC编译器介绍 GCC是GNU项目的编译器组件之一,也是GNU软件产品家族具有代表性 的作品。GCC的发展大体经历了下面的几个阶段。 ① 1987年,第一版的GCC发布。 ② 2001.6.18,GCC3.0正式发布。 ③ 2004.4.20,GCC 3.4.0版本发布。 ④ 2005.4.22,最新版本的GCC 4.0发布,官方网站:http://gcc.gnu.org。 GCC是一组编译工具的总称,其软件包里包含众多的工具,按其类型, 主要有以下的分类。 ① C编译器 cc, cc1, cc1plus, gcc ② C++编译器 c++, cc1plus, g++ ③ 源码预处理程序 cpp, cpp0 ④ 库文件 libgcc.a, libgcc_eh.a, libgcc_s.so, libiberty.a, libstdc++.[a,so], libsupc++.a
3.4.2 GCC编译选项解析 GCC是Linux下基于命令行的c语言编译器,其基 本的使用语法如下。 gcc [option | filename ]… 对于编译C++的源程序,其基本的语法如下。 g++ [ option | filename ]… GCC拥有众多的命令选项,有超过100个的编译选 项可用,按其应用有如下的分类。
1.常用编译选项 2.出错检查和警告提示选项 3.代码优化选项 4.调试分析选项
3.5 调试器GDB的使用技巧 3.5.1 GDB调试器介绍 以下是GDB所提供的一些功能。 启动程序,并且可以设置运行环境和参数来运行 指定程序。 让程序在指定断点处停止执行。 对程序做出相应的调整,这样就能纠正一个错误 后继续调试。 使用gdb命令的语法如下。 # gdb [参数] Filename
3.5.2 GDB调试命令 常用到的GDB调试命令。 命 令 说 明 file 指定要调试的可执行程序 kill 终止正在调试的可执行程序 命 令 说 明 file 指定要调试的可执行程序 kill 终止正在调试的可执行程序 next 执行一行源代码但并不进入函数内部 list 部分列出源代码 step 执行一行源代码并不进入函数内部 run 执行当前的可执行程序 quit 结束gdb调试任务 watch 可以检查一个变量的值而不管它何时被改变 print 打印表达式的值到标准输出 break N 在指定的第N行源代码设置断点 info break 显示当前断点清单,包括到达断点处的次数等 info files 显示被调试文件的详细信息 info func 显示所有的函数名 info local 显示当函数中的局部变量信息 info prog 显示被调试程序的执行状态 info var 显示所有的全局和静态变量名称 make 在不退出 gdb 的情况下运行 make 工具 shell 在不退出 gdb 的情况下运行shell命令 continue 继续执行正在调试的程序
3.6 Linux编程库 3.6.1 Linux编程库介绍 Linux下的库文件分为共享库和静态库2大类,它 们两者的差别仅在程序执行时所需的代码是在运 行时动态加载的,还是在编译时静态加载的。此 外,通常共享库以.so(Shared Object)结尾,静态链 接库通常以.a结尾(Archive)。在终端下查看库 的内容,通常共享库为绿色,而静态库为黑色。 Linux的库一般在/lib或/usr/lib目录下。它主要存放 系统的链接库文件,没有该目录则系统无法正常 运行。
3.6.2 Linux系统调用 从字面意思上理解,系统调用说的是操作系统提供给用户 程序调用的一组“特殊”接口。Linux系统有200多个系统 调用,这些系统调用按照功能分类大致可分为以下几个方 面。 进程控制 文件系统控制 系统控制 内存管理 网络管理 socket控制 用户管理 进程间通信
3.6.3 Linux线程库 简单地讲,进程是资源管理的最小单位,线程是 程序执行的最小单位。一个进程至少需要一个线 程作为它的指令执行体,进程管理着资源(比如 cpu、内存、文件等),而将线程分配到某个cpu 上执行。一个进程当然可以拥有多个线程。 pthread_create() 创建新的线程 pthread_join() 等待线程结束 pthread_self() 获取线程ID pthread_detach() 用于让线程脱离 pthread_exit() 终止线程
Q&A www.farsight.com.cn
谢谢! www.farsight.com.cn