《Linux下的C编程基础 .pdf》由会员分享,可在线阅读,更多相关《Linux下的C编程基础 .pdf(45页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、)第 3 章 Linux下的 C编程基础本章目标在熟悉了Linux 常见命令,能够在Linux 中熟练操作之后,本章将带领读者学习在Linux 中进行 C语言编程的基本技能。学习了本章后,读者能够掌握如下内容。熟悉 Linux 系统下的开发环境熟练 Emacs的基本操作熟练使用Gcc 编译器的常用选项熟悉 Makefile 基本原理及语法规范3.1 Linux 下 C 语言编程概述3.1.1 C 语言简单回顾C 语言最早是由贝尔实验室的Dennis Ritchie 为了 UNIX 的辅助开发而编写的,它是在 B语言的基础上开发出来的。尽管语言不是专门针对UNIX 操作系统或机器编写的,但它与U
2、NIX 系统的 关系十分紧密。由 于它的 硬件无关性和可移植性,使 C 语言 逐渐成 为世界 上使用最广泛计算 机语言。为了进 一步规范C 语言的 硬件无关性,1987 年,美国国 家标 准协会(ANSI)根据 C 语言问世以 来各种版 本对 C 语言的发 展和扩充,制定 了新的标 准,称为 ANSI C。ANSI C 语言比原 来的标 准 C 语言 有了很大 的发 展。目 前流 行的 C 语言编 译系统 都是以它为基础的。C 语言的 成功并 不是 偶然 的,它 强大 的功能和它的 可移植性让 它能在 各种硬件平台上游刃自 如。总体 而言,C 语言 有如下 特点。?C 语言是“中级语言”。它
3、把高级 语言的基本 结构和 语句与低级 语言的实 用性结合起名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 45 页 -应用 程序开发 详解嵌入式 Linux 应用 程序开发 详解图书 样章来。C 语言 可以 像汇 编语言 一样对位、字节 和地址 进行操作,而 这三 者是 计算 机最基本的 工作单 元。?C 语言是 结构 化的语言。C 语言 采用代码及数 据分隔,使程序的各个部 分除了必要 的信息交 流 外彼此独立。这 种结构 化方 式可使 程序层次 清晰,便于使用、维护 以及调试。C 语言是 以函数形 式提供给 用 户的,这些函数 可方便地调 用,并具有多种循环、条 件语句控制
4、程序流 向,从而使程序完全 结构 化。?C 语言 功 能齐全。C 语言 具 有各种各 样的数据类型,并引入了 指针概 念,可使 程序效率更 高。另外,C 语言 也具 有强大 的图 形功能,支持多 种显示器和 驱动 器,而 且计算功 能、逻辑判断 功能也比较强大,可以 实现决策 目的。?C 语言 可移植性强。C 语言 适合多种操作系统,如DOS、Windows、Linux,也适 合多种体 系 结构,因此尤其适 合在嵌入式领 域的开发。3.1.2 Linux 下 C 语言编程 环境概述Linux 下的 C 语言程 序设计与 在其他环境 中的 C 程序设计一样,主要涉及到 编辑器、编译链接 器、调试
5、 器及项目管 理工具。现在 我们先 对这 4 种工具 进行简单 介绍,后面会对其一一进行 讲 解。(1)编 辑器Linux 下的编 辑器就如 Windows 下的 word、记事 本等 一样,完成对所录 入文字的编 辑 功能。Linux 中最常 用 的编 辑器有 Vi(Vim)和 Emacs,它们功能 强大,使用 方便,广受编程 爱好 者的 喜爱。在本 书中,着重介绍 Vi 和 Emacs。(2)编 译链接 器编 译是指源 代码 转化 生成可 执 行代码 的过程,它 所 完成工作主要 如 图 3.1 所示。可见,在编 译过程是 非 常复杂 的,它包括词法、语法和语义 的分析、中间代码 的生成和
6、 优化、符号表 的管 理和出错处理等。在 Linux 中,最常用的编 译器 是 Gcc 编译器。它是 GNU 推出的 功能强大、性能 优越 的多平台 编译器,其执行效率与一 般的编 译器 相比平 均 效率要 高 20%30%,堪称为 GNU 的代表作品之一。(3)调试 器调试 器并 不是 代码 执行的 必备工具,而是专为程 序员 方便调试 程序而 用的。有编程 经验的读者都知道,在编程的 过程当中,往往 调试 所消耗的时间 远远 大于 编写 代码 的时间。因此,有一 个功能强大、使用 方便 的 调试 器是必 不可少的。Gdb 是绝 大多数 Linux 开发 人员所 使用 的调试 器,它可以 方
7、便地设 置断点、单步跟踪等,足源代码*.c 预处理 器头文 件*.h 编译器目标 代码*.o 可执行文件引导代码库函数汇编处理链接图 3.1 编译过程名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 45 页 -第3章Linux 下的 C 编程基础63华清远见“嵌入式 Linux 应用 开发班”培训 教材名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 45 页 -应用 程序开发 详解嵌入式 Linux 应用 程序开发 详解图书 样章图 3.2 进入 Vi 命令行 模式图 3.3 进入 Vi 插入模式(3)最后,在 插入 模式中,输入“Esc”,则当前模式转入命令行 模
8、式,并在底行行中 输入“:wq”(存盘退 出)进入 底行模式,如 图 3.4 所示。这样,就完成了一 个简单的Vi 操作 流程:命令行 模式插入模式底 行模式。由 于 Vi在不 同的 模式下 有不同的操作 功能,因此,读者 一定要时刻注意 屏幕 最下 方的提示,分清所在的 模式。名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 45 页 -第3章Linux 下的 C 编程基础65华清远见“嵌入式 Linux 应用 开发班”培训 教材名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 45 页 -应用 程序开发 详解嵌入式 Linux 应用 程序开发 详解图书 样章目录目
9、录 内 容X 删除光标所在位置的“前 面”一 个字 符dd 删除光标所在行ndd 从光标所在行开 始向下删除 n 行yy 复制光标所在行nyy 复制光标所在行开 始的向下 n 行p 将缓冲区 内的 字符粘贴 到光标所在位置(与 yy 搭配)U 恢复前一 个动 作(2)插入模式的 功 能键只 有一 个,也就是 Esc 退出到命令行 模式。(3)底行模式常见 功能键如表 3.2 所示。表 3.2 Vi 底行模式功能键目录目 录 内 容:w 将编 辑的文件保存 到磁盘 中:q 退出 Vi(系统对 做过 修改的文件会 给出提示):q!强制 退出 Vi(对 修改 过的文件不作 保存):wq 存盘 后退出
10、:w filename 另存一个命为 filename 的文件:set nu 显示 行号,设定之后,会在每一行的 前面显示 对应行号:set nonu 取消行号显示名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 45 页 -第3章Linux 下的 C 编程基础67华清远见“嵌入式 Linux 应用 开发班”培训 教材注释Emacs 缩写注释:C-表示按住 Ctrl 键的同时键入字符。因此,C-f 就表示按住Ctrl 键同时键入f。M-表示当键入字符时同时按住 Meta 或 Edit 或 Alt 键(通常为Alt 键)。3.3.1 Emacs 的基本操作1Emacs 安装现在 较新
11、版 本的 Linux(如本 书中所用的 Red Hat Enterprise 4 AS)的 安装 光盘中一般都自带有 Emacs的安装 包,用户可以 通过安装 光盘 进行 安装(一般在第 2 张光盘 中)。2启动 Emacs 安装 完 Emacs之后,只需在命令行 键 入“emacs 文件名”(若缺省 文件名,也可在 emacs编辑文件 后另存时指定),也可从“编程”“emacs”打开,3.5 图中所示的就是从“编程”“emacs”打开的 Emacs 欢迎 界面。图 3.5 Emacs欢迎 界面接着 可单击任意键 进入 Emacs 的工作窗口,如图 3.6 所示。从图 中可见,Emacs 的工
12、作窗口 分 为上下 两个部分,上 部为编 辑窗口,底部为命令 显示窗口,用 户执行功能键的 功能都会 在底 部有相应的显示,有时也需要用户在底部窗口 输入相应的命令,如 查找 字符串 等。名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 45 页 -应用 程序开发 详解嵌入式 Linux 应用 程序开发 详解图书 样章图 3.6 Emacs的工作窗口3进入 Emacs 在进入 Emacs后,即可进行 文件的编 辑。由于 Emacs 只有一种 编辑模式,因此用户无需进行 模式 间的切换。下 面介绍 Emacs 中基本编 辑功能键。(1)移动光标虽然 在 Emacs中 可以使用“上”、
13、“下”、“左”、“右”方向 键来移动单个字符,但笔者还是建议 读者学习 其对应功 能键,因为它 们不仅能在 所有类型 的终端 上工作,而 且读者将 会发现在熟练 使用 之后,输入 这些 Ctrl 加字 符会比 按方向 键快 很多。下表 3.3 列举了 Emacs 中光标移动的常见 功能键。表 3.3 Emacs光标移动功能键目录目 录 内 容目录目 录 内 容C-f 向前移 动一个字 符M-b 向后移动一个单词C-b 向后移动一个字 符C-a 移动到 行首C-p 移动到 上一行C-e 移动到 行尾C-n 移动到 下一行M-(M 加“大于 号”)移动光标到整个文本的 末尾(2)剪切和粘贴在 Em
14、acs 中可以使用“Delete”和“BackSpace”删除光标前后的字符,这和用户之前的习惯一致,在 此就不赘述。以词和行为单 位的剪切和粘贴 功能键如表 3.4 所示。名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 45 页 -第3章Linux 下的 C 编程基础69华清远见“嵌入式 Linux 应用 开发班”培训 教材注意在 Emacs 中对单个字符的操作是“删除”,而对词和句的操作是“剪切”,即保存在缓冲区中,以备后面的“粘贴”所用。(3)复制文本在 Emacs 中的 复 制文本包括两 步:选择 复制区域和粘贴文本。选择 复制区域的方 法是:首先在复 制起 始点(A)按
15、下“C-Spase”或“C-(C-Shift-2)”使它成为 一个表示点,再 将光标移至复制结 束电(B),再按下“M-w”,就可将 A 与 B 之间的文本复 制到系统的 缓冲区 中。在 使用功 能键 C-y 将其粘贴到指 定位置。(4)查找 文本查找 文本的 功能键 如表 3.5 所示。表 3.5 Emacs查找文本功能键目录目 录 内 容C-s 查找光 标以后的内容,并在对 话框 的“I-search:”后输入 查找字符串C-r 查找光 标以前 的内容,并在对 话框 的“I-search backward:”后输入查找 字符串(5)保存 文档在 Emacs 中保存 文档的功能键 为“C-x
16、 C-s”(即先操作 C-x,接着再操作 C-s),这时,屏幕 底下的对 话框 会出现 如“Wrote/root/workplace/editor/why”字样,如 图 3.7 所示。图 3.7 Emacs中保存 文档名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 45 页 -应用 程序开发 详解嵌入式 Linux 应用 程序开发 详解图书 样章另外,Emacs 在编 辑时 会为每个文件 提供“自 动保存(auto save)”的机 制,而且自动保存的文件 的文件名前后 都有一 个“#”,例如,编 辑名为“hello.c”的文件,其自动保存 的文件的文件 名就叫“#hello.c
17、#”。当用户 正常的 保存 了文件后,Emacs就会删除这个 自动保存 的文件。这个 机制当系统发 生异常时非 常有用。(6)退出文档在 Emacs 中退出 文档的功能键为“C-x C-c”。3.3.2 Emacs 的编译概述正如本 节前面所 提到 的,Emacs 不仅仅 是个强大的编 译器,它 还是一个集编译、调试 等于一体 的 工作环境。在 这里,读者将 会了 解到 Emacs 作为编 译器 的最基本的概 念,感兴趣 的读者 可以 参考 Learning GNU Emacs,Second Edition 一书 进一步深入学习 Emacs。1Emacs 中的模式正如本 节前面提到 的,在 E
18、macs中并没有像 Vi 中那样的“命令行”、“编辑”模式,只有一种编辑模式。这 里所说的“模式”,是指 Emacs里的各种 辅助环境。下面就着重 了解一 下 C 模式。当我们 启动某一文 件时,Emacs 会判断 文件的类型,从而自动选择 相应的模式。当然,用户也 可以 手动启动各种 模式,用功 能键“M-x”,然后再输 入模式的 名称,如 图所示 3.8 所示就启动 了“C 模式”。图 3.8 Emacs中选择 模式在强大 的 C 模式下,用户拥有“自 动缩进”、“注释”、“预处理 扩展”、“自动状态”等强大功 能。在“C 模式”下编 辑代码 时,可以用“Tab”键自动的将当前行的 代码
19、产生适当的缩进,使代码 结构 清晰、美 观,它 也可以 指 定缩进的 规则。源代码要 有良好可 读性,必须要有良 好的注释。在 Emacs中,用“M-”可以 产生一条右缩进的 注 释。C 模式下是“/*comments*/”形式的 注释,C+模式下是“/comments”形式的注释。当用户高亮选 定 某段 文本,然后操作“C-c C-c”,就可以 注释该段文字。Emacs 还可以使用C 预处理 其运 行代码 的一部分,以便让程序员检测宏、条件编译以 及名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 45 页 -第3章Linux 下的 C 编程基础71华清远见“嵌入式 Linux
20、 应用 开发班”培训 教材名师资料总结-精品资料欢迎下载-名师精心整理-第 11 页,共 45 页 -应用 程序开发 详解嵌入式 Linux 应用 程序开发 详解图书 样章int main()printf(Hello!This is our embedded world!n);return 0;(1)预处理 阶段在该 阶段,编译器 将上述 代码 中的 stdio.h 编译进来,并且用户可以使用Gcc 的选项“-E”进行 查看,该选项的作 用 是让 Gcc 在预处理 结束后停止 编译过程。名师资料总结-精品资料欢迎下载-名师精心整理-第 12 页,共 45 页 -第3章Linux 下的 C 编程
21、基础73华清远见“嵌入式 Linux 应用 开发班”培训 教材名师资料总结-精品资料欢迎下载-名师精心整理-第 13 页,共 45 页 -应用 程序开发 详解嵌入式 Linux 应用 程序开发 详解图书 样章就是链接 到 libc.so.6 库函数 中去,这样 就能实 现函数“printf”了,而 这也就是链接的作 用。函数 库一般分为静 态库和动态库两 种。静态库是指编译链接时,把库文 件的代码全部 加入到可执 行文件中,因此 生成的文件比 较大,但在运行时也就不再需要库文 件了。其后缀名一般为“.a”。动态库 与之相反,在编 译链接时 并没有把 库文件的代码 加入到可执行文件中,而是在程
22、序执行时由运行 时链接文 件加 载库,这样 可以 节省系统的开 销。动态库一般后缀名为“.so”,如 前 面所 述的 libc.so.6 就是动态库。Gcc 在编 译时默认 使用动态库。完成 了链接 之后,Gcc 就可以 生成可 执行文件,如下 所示。rootlocalhost Gcc#Gcc hello.o o hello 运行 该可执行文件,出 现正确的结 果如下。rootlocalhost Gcc#./hello Hello!This is our embedded world!3.4.2 Gcc 编译选项分析Gcc 有 超过 100 个 的可用 选项,主要 包括 总体 选项、告警和出错
23、选项、优化选项和体 系结构 相关 选项。以下对 每 一类中最常 用的 选项进行 讲解。(1)总体 选项Gcc 的 总结 选项如表 3.7 所示,很多在前 面的示例中已经有所涉及。表 3.7 Gcc 总体选项列表后缀名所对应的语言-c 只是编 译不链接,生成目标 文件“.o”-S 只是编 译不汇编,生成汇编代码-E 只进行 预编译,不 做其他 处理-g 在可执行程 序中包含标准调试信息-o file 把输出文件输出到 file 里-v 打印出编 译器 内部编译各 过程的命令行 信息 和编译器 的版本-I dir 在头文 件的搜索路径 列表 中添加 dir 目录-L dir 在库文 件的搜索路径
24、列表 中添加 dir 目录-static 链接 静态库-llibrary 连接名为 library 的库文 件对于“-c”、“-E”、“-o”、“-S”选项 在前一 小节中已经讲 解了其使用 方法,在此主要 讲解另外 两个 非常常 用的库依赖 选项“-I dir”和“-L dir”。?“-I dir”正如上 表中所述,“-I dir”选项可以 在头文 件的搜索路径 列表中添加 dir 目录。由于 Linux中头文 件都 默认 放到了“/usr/include/”目 录下,因此,当用户希望添 加放置在其他位 置的头文件时,就可以 通过“-I dir”选项来指 定,这样,Gcc 就会到相应的位置查
25、找 对应的目录。名师资料总结-精品资料欢迎下载-名师精心整理-第 14 页,共 45 页 -第3章Linux 下的 C 编程基础75华清远见“嵌入式 Linux 应用 开发班”培训 教材小知识在 include 语句中,“”表示在 标准路径 中搜索头文件,“”表示在 本目录 中搜索。故在上例中,可把 hello1.c 的“#include”改为“#include“my.h”,就不需要加上“-I”选项了。?“-L dir”选项“-L dir”的功能与“-I dir”类似,能够在 库文件的搜索路径 列表中添加 dir 目录。例如有程 序 hello_sq.c 需要用到目录“/root/workpl
26、ace/Gcc/lib”下的 一个动 态库 libsunq.so,则只需键入如下命令 即可:rootlocalhost Gcc Gcc hello_sq.c L/root/workplace/Gcc/lib lsunq o hello_sq 需要 注意 的是,“-I dir”和“-L dir”都 只是指定了路径,而没有指定文件,因此 不能在路径 中包 含文件名。另外 值得详细解释 一下的是“-l”选项,它指示 Gcc 去连接库文 件 libsunq.so。由于在 Linux下的 库文 件命名时有一 个 规定:必须以 l、i、b 3 个字 母开头。因此在用-l 选项指定链接 的库文件名时 可以
27、省去 l、i、b 3 个字 母。也就是说 Gcc 在对“-lsunq”进行 处理时,会自 动去链接名为 libsunq.so 的文件。(2)告警 和出错选 项Gcc 的 告警 和出错选项 如表 3.8 所示。表 3.8 Gcc 总体选项列表选项含义-ansi 支持 符合 ANSI 标准的 C 程序-pedantic 允许 发出 ANSI C 标准所列 的全部 警告 信息续表选项含义名师资料总结-精品资料欢迎下载-名师精心整理-第 15 页,共 45 页 -应用 程序开发 详解嵌入式 Linux 应用 程序开发 详解图书 样章-pedantic-error 允许 发出 ANSI C 标准所列 的
28、全部 错误信息-w 关闭所有告警-Wall 允许 发出 Gcc 提供 的所有有用 的报警 信息-werror 把所有的告警 信息 转化为错误信息,并在告警 发生时 终止编译过程下面 结合 实例对这 几个告警 和出错 选项进行简单的 讲解。如有以 下程 序段:#include void main()long long tmp=1;printf(This is a bad code!n);return 0;这是 一个很糟糕 的程 序,读者 可以 考虑一下有哪些问题??“-ansi”该选 项强制 Gcc 生成标准语法所 要求的告警 信息,尽管 这还并不能 保证所有没有警告 的程序都 是 符合 ANS
29、I C 标准 的。运行结果如下 所示:rootlocalhost Gcc#Gcc ansi warning.c o warningwarning.c:在函数“main”中:warning.c:7 警告:在 无返回值 的函数 中,“return”带返回值warning.c:4 警告:“main”的 返回类型不 是“int”可以 看出,该选项 并没有发现“long long”这个无效数 据类型的错误。?“-pedantic”允许 发出 ANSI C 标准所列 的全部 警告 信息,同样也 保证所有没有警告 的程序都 是符合ANSI C 标准的。其运行结果如下 所示:rootlocalhost Gcc
30、#Gcc pedantic warning.c o warningwarning.c:在函数“main”中:warning.c:5 警告:ISO C90不支 持“long long”warning.c:7 警告:在 无返回值 的函数 中,“return”带返回值warning.c:4 警告:“main”的 返回类型不 是“int”可以 看出,使用 该 选项查看 出了“long long”这个 无效数 据类型 的错误。?“-Wall”允许 发出 Gcc 能够 提供 的所有有用 的报警 信息。该选项的运行结果如下 所示:rootlocalhost Gcc#Gcc Wall warning.c o
31、warningwarning.c:4 警告:“main”的 返回类型不 是“int”名师资料总结-精品资料欢迎下载-名师精心整理-第 16 页,共 45 页 -第3章Linux 下的 C 编程基础77华清远见“嵌入式 Linux 应用 开发班”培训 教材名师资料总结-精品资料欢迎下载-名师精心整理-第 17 页,共 45 页 -应用 程序开发 详解嵌入式 Linux 应用 程序开发 详解图书 样章下有什么 很好的调试工具 呢?本文所介绍 的 Gdb 调试 器是 一款 GNU 开发 组织 并发布的 UNIX/Linux下的程 序调试工具。虽然,它 没有图 形化 的友好界面,但 是它 强大 的功能
32、也足以与微软的 VC 工具 等媲美。下面就 请 跟随笔者一步步 学习 Gdb 调试 器。3.5.1 Gdb 使用流 程这里 给出了 一个短 小的程 序,由此带领读者熟悉一下 Gdb 的使用流 程。建议读者能够实际动手操作。首先,打开 Linux 下的编 辑器 Vi 或者 Emacs,编 辑如下代码(由于为了更好地熟悉 Gdb的操作,笔者在 此使用 Vi 编辑,希望 读者能够 参 见 3.3 节中对 Vi 的介绍,并熟练 使用 Vi)。/*test.c*/#include int sum(int m);int main()int i,n=0;sum(50);for(i=1;i=50;i+)n+=
33、i;printf(The sum of 1-50 is%d n,n);int sum(int m)int i,n=0;for(i=1;i=m;i+)n+=i;printf(The sum of 1-m is%dn,n);在保存退 出后 首先 使用 Gcc 对 test.c 进行编 译,注意 一定 要加上选项“-g”,这样 编译出的可执行 代码 中才包含调试信息,否则 之后 Gdb 无法载入该可执行文件。rootlocalhost Gdb#gcc-g test.c-o test虽然 这段程序没有 错误,但调试完全 正确的程 序可以 更加了解 Gdb 的使用流 程。接下来就启动 Gdb 进行 调试
34、。注意,Gdb 进行 调试 的是 可执行文件,而不是如“.c”的源代码,因此,需要 先通过 Gcc 编 译生成可 执行文 件才能用 Gdb 进行 调试。名师资料总结-精品资料欢迎下载-名师精心整理-第 18 页,共 45 页 -第3章Linux 下的 C 编程基础79华清远见“嵌入式 Linux 应用 开发班”培训 教材注意在 Gdb 的命令中 都可使用缩略形 式的 命令,如“l”代便“list”,“b”代表“breakpoint”,“p”代 表“print”等,读者 也可使用“help”命令查看 帮助信息。(Gdb)l1#include 2 int sum(int m);3 int main
35、()4 5 int i,n=0;6 sum(50);7 for(i=1;i=50;i+)8 9 n+=i;10 (Gdb)l11 printf(The sum of 150 is%d n,n);12 13 14 int sum(int m)15 16 int i,n=0;17 for(i=1;i=m;i+)18 n+=i;19 printf(The sum of 1m is=%dn,n);名师资料总结-精品资料欢迎下载-名师精心整理-第 19 页,共 45 页 -应用 程序开发 详解嵌入式 Linux 应用 程序开发 详解图书 样章20 可以 看出,Gdb 列 出的 源代码 中明确 地给 出了
36、对 应的行 号,这样 就可以大大 地方便代码的定位。(2)设置断点设置 断点是调试 程序中是 一个非常重要的 手段,它可以使 程序到一定位置暂停它的运行。因此,程序 员在该位置处 可以 方便地 查看 变量 的值、堆栈情况 等,从而找出代码的症结所在。在 Gdb 中设置 断点非常简单,只 需在“b”后加入对应的行 号即可(这是最常 用的方式,另外 还有 其他方 式设置断 点)。如下 所示:(Gdb)b 6Breakpoint 1 at 0 x804846d:file test.c,line 6.要注意 的是,在 Gdb 中利用行号 设置断点是指代码 运行到对应行之 前将其停止,如上 例中,代码
37、运行到第 5行之 前暂停(并没有 运行第 5 行)。(3)查看 断点情况在设 置完断 点之后,用户可以 键入“info b”来查看 设置断点情况,在 Gdb 中可以 设置多个断 点。(Gdb)info bNum Type Disp Enb Address What 1 breakpoint keep y 0 x0804846d in main at test.c:6(4)运行代码接下来 就可运行代码 了,Gdb 默认 从 首行开 始运行代码,可键入“r”(run)即可(若想从程序中 指定行开 始运行,可在 r 后面加上行 号)。(Gdb)rStarting program:/root/work
38、place/Gdb/test Reading symbols from shared object read from target memory.done.Loaded system supplied DSO at 0 x5fb000 Breakpoint 1,main()at test.c:6 6 sum(50);可以 看到,程 序运 行到断 点处就 停止 了。(5)查看 变量值在程 序停止运 行之后,程 序员所 要做 的工作是 查看断点处的相关变量值。在 Gdb 中只需键入“p”变 量 值即可,如下 所 示:(Gdb)p n$1=0(Gdb)p i$2=134518440 名师资料总结-
39、精品资料欢迎下载-名师精心整理-第 20 页,共 45 页 -第3章Linux 下的 C 编程基础81华清远见“嵌入式 Linux 应用 开发班”培训 教材小技巧Gdb 在显示变量值 时都会 在对 应值之前加上“$N”标记,它是当 前变量值 的引用标记,所以以后 若想再次引 用此 变量 就可以 直接写 作“$N”,而 无需写冗长 的变量名。(6)单 步运行单步 运行可以使用 命令“n”(next)或“s”(step),它 们之间的区别 在于:若有函数调用的时候,“s”会 进入 该函数 而“n”不会进入 该函数。因此,“s”就类似于 VC 等工具 中的step in”,“n”类似与 VC 等工具
40、 中的“step over”。它 们的使用 如下 所示:(Gdb)nThe sum of 1-m is 1275 7 for(i=1;i=50;i+)(Gdb)ssum(m=50)at test.c:16 16 int i,n=0;可见,使用“n”后,程 序显示函数sum 的运行结果并向下执行,而 使用“s”后则进入到 sum 函数 之中单 步 运行。(7)恢复程序运行在查看 完所需 变量 及堆栈情况 后,就可以使用 命令“c”(continue)恢复程序的正常运行了。这时,它 会把 剩余 还 未执行的程 序 执行完,并显示 剩余 程序中的 执行结果。以下是之 前使用“n”命令 恢 复后的 执
41、行结果:(Gdb)cContinuing.The sum of 1-50 is:1275 Program exited with code 031.可以 看出,程 序在 运行完后退出,之后程 序处于“停止状态”。名师资料总结-精品资料欢迎下载-名师精心整理-第 21 页,共 45 页 -应用 程序开发 详解嵌入式 Linux 应用 程序开发 详解图书 样章List of classes of commands:aliases-Aliases of other commands breakpoints-Making program stop at certain points data-Exam
42、ining data files-Specifying and examining files internals-Maintenance commands Type help followed by a class name for a list of commands in that class.Type help followed by command name for full documentation.Command name abbreViations are allowed if unambiguous.上述 列出了 Gdb 各个分类的命令,注意底 部的加粗部分说明 其为分类命
43、令。接下来 可以具体查找 各分 类种的命令。如下 所示:(gdb)help data Examining data.List of commands:call-Call a function in the program delete display-Cancel some expressions to be displayed when program stops delete mem-Delete memory region disable display-Disable some expressions to be displayed when program stops Type he
44、lp followed by command name for full documentation.Command name abbreViations are allowed if unambiguous.至此,若用户想要 查找 call 命令,就 可键入“help call”。(gdb)help callCall a function in the program.The argument is the function name and arguments,in the notation of the current working language.The result is pri
45、nted and saved in the value history,if it is not void.当然,若用户已知 命令 名,直接键 入“help command”也是可以的。Gdb 中的命令 主要 分为以下几类:工作环境 相关命令、设置断点与 恢复命令、源代码 查看命令、查看 运行数据相关 命令 及修改 运行参数命令。以下就分别对这几类的命令进行 讲解。名师资料总结-精品资料欢迎下载-名师精心整理-第 22 页,共 45 页 -第3章Linux 下的 C 编程基础83华清远见“嵌入式 Linux 应用 开发班”培训 教材名师资料总结-精品资料欢迎下载-名师精心整理-第 23 页,共
46、 45 页 -应用 程序开发 详解嵌入式 Linux 应用 程序开发 详解图书 样章由于 设置 断点在 Gdb 的调试 中 非常 重要,所 以在此再着重讲 解一 下 Gdb 中设置断点的方法。Gdb 中设置断点有 多 种方式:其一是按 行设置断点,设置方法在 3.5.1 节已经指出,在此就不重复 了。另外 还可以 设置函数断 点和 条件断点,在 此结合上一小节的代码,具体介绍 后两种设置 断点的方法。函数断 点Gdb 中按函数设 置断 点只需把函数 名列在命令“b”之后,如下 所示:(gdb)b sumBreakpoint 1 at 0 x80484ba:file test.c,line 16
47、.(gdb)info b Num Type Disp Enb Address What 1 breakpoint keep y 0 x080484ba in sum at test.c:16 要注意 的是,此时 的断点实际是在 函数 的定义处,也就是在 16 行处(注意 第 16 行还未执行)。条件断 点Gdb 中设置条件断点 的格式为:b 行数或函数 名 if 表达式。具体实例如下 所示:(gdb)b 8 if i=10 Breakpoint 1 at 0 x804848c:file test.c,line 8.(gdb)info b Num Type Disp Enb Address Wh
48、at 1 breakpoint keep y 0 x0804848c in main at test.c:8 stop only if i=10(gdb)r Starting program:/home/yul/test The sum of 1-m is 1275 Breakpoint 1,main()at test.c:9 9 n+=i;(gdb)p i$1=10 可以 看到,该例中在第 8 行(也就是运行完第 7 行的 for 循环)设置了一个“i=0”的条件断点,在程 序运行之后 可以 看出,程 序确实在 i 为 10 时暂停运 行。3Gdb 中源码查看相关命令在 Gdb 中可以 查看
49、 源码以方便其他 操作,它的常见相关命令如 表 3.12 所示。名师资料总结-精品资料欢迎下载-名师精心整理-第 24 页,共 45 页 -第3章Linux 下的 C 编程基础85华清远见“嵌入式 Linux 应用 开发班”培训 教材名师资料总结-精品资料欢迎下载-名师精心整理-第 25 页,共 45 页 -应用 程序开发 详解嵌入式 Linux 应用 程序开发 详解图书 样章The sum of 1-50 is 1279 Program exited with code 031.可以 看到,最后的 运行结果确 实比 之前的值大了 4。Gdb 的使用切记点:?在 Gcc编译 选项中一 定要加
50、入“-g”。?只有在代码处于“运行”或“暂停”状态 时才能查看 变量值。?设置断点 后程序 在指 定行之前停止。3.6 Make 工程管 理器到此 为止,读者 已 经了解了如 何在 Linux 下使用 编辑器编写代码,如 何使用 Gcc 把代码编译成可 执行文件,还学习了如 何使用 Gdb 来调试 程序,那么,所有的工作看似已经完成了,为什么还需 要 Make 这个工 程管 理器呢?所谓 工程管 理器,顾 名思义,是 指 管理较多 的文件的。读者 可以 试想一下,有一 个上百个文件的 代码 构成 的项目,如 果其中只 有一 个或少数几个文件进行了 修改,按照之前所学的Gcc 编译 工具,就不得