第 23 章 编 译 器 和 库 : gcc , g + + 和 gdb

应 用 程 序 是 程 序 开 发 人 员 使 用 某 种 编 程 语 言 创 建 的 可 执 行 文 件 。 Linux 提 供了 一 些 工 具 程 序 ,使 开 发 人 员 能 够 控 制 应 用 程 序 的 开 发 过 程 。在 这 些 工 具 中 ,gcc 是 最 重 要 的 一 个 , 它 可 以 调 用 C 和 C + + 编 译 器 , 生 成 相 应 的 可 执 行 文 件 。 绝大 多 数 的 Linux 应 用 程 序 是 使 用 C 或 C + + 语 言 编 写 的 。

在 应 用 程 序 开 发 过 程 中 经 常 使 用 到 库 , 这 些 库 可 能 是 开 发 人 员 事 先 创 建 的自 己 的 库 , 也 可 能 是 他 人 提 供 的 专 门 用 途 的 函 数 库 。 开 发 人 员 可 以 使 用 X- W indows 库 编 写 X-Windows 程 序 的 图 形 显 示 界 面 , 也 可 以 使 用 gdbm 库 实 现对 数 据 库 文 件 的 访 问 。 库 的 使 用 正 变 得 越 来 越 灵 活 , 现 在 可 以 实 现 库 的 共 享 或动 态 载 入 。

Linux 中 还 有 一 些 程 序 开 发 中 使 用 的 其 它 工 具 。 gdb 符 号 调 试 器 可 以 帮 助 开发 人 员 定 位 程 序 发 生 的 错 误 , indent 和 cproto 可 以 对 源 代 码 进 行 优 化 处 理 。Autoconf 和 RPM 则 可 以 为 程 序 发 行 提 供 帮 助 。 Linux 中 还 有 其 它 主 要 编 程 语 言的 编 译 器 , 这 些 语 言 包 括 Pasca l、 Lisp 、 Ada 、 Fortran、 Basic 和 Modula-2 等 。

获 取 信 息 : info

尽 管 所 有 的 编 译 器 和 应 用 工 具 都 有 相 应 的 帮 助 页 , 但 使 用 GNU 的 info 系 统可 以 得 到 更 为 详 细 的 软 件 信 息 。 在 /usr/info 目 录 下 包 含 有 各 种 GNU 工 具 的 详 细描 述 和 例 子 文 件 。 这 些 文 件 就 相 当 于 是 各 种 工 具 的 在 线 手 册 。 在 这 个 目 录 中 可以 找 到 gcc 编 译 器 、 C 和 C + + 函 数 库 、 Autoconf 应 用 程 序 , 甚 至 Indent 程 序的 详 细 信 息 文 档 。有 些 应 用 程 序 将 相 应 的 信 息 文 件 放 在 自 己 的 目 录 下 ,如 LaTeX 的 信 息 文 件 就 存 放 在 /usr/TeX/info 目 录 下 。 键 入 命 令 info 就 可 以 调 出 info 文 档的 主 菜 单 界 面 。

$ info

使 用 空 格 键 可 以 向 下 翻 页 , 按 M 键 可 以 按 照 主 题 对 文 档 进 行 搜 索 , 此 时 在屏 幕 下 方 会 出 现 一 个 空 行 , 用 户 可 以 在 行 中 输 入 菜 单 项 的 名 。 按 回 车 键 可 以 查看 对 应 选 择 的 主 题 。 按 B 键 可 以 回 到 文 档 的 开 始 部 位 , 按 U 键 则 可 以 回 到 上 一次 查 看 的 菜 单 项 。 键 入 info info 命 令 可 以 打 开 一 个 教 用 户 如 何 使 用 info 的 教 程 。

C 编 译 器 : gcc

UNIX 操 作 系 统 和 C 语 言 中 存 在 一 种 特 殊 的 关 系 。 C 语 言 起 先 就 是 为 了 开 发

UNIX 操 作 系 统 而 设 计 的 , UNIX 操 作 系 统 也 是 用 C 语 言 编 写 的 。 Linux 也 与 C

语 言 存 在 这 种 特 殊 关 系 。绝 大 部 分 的 Linux 操 作 系 统 中 都 包 含 了 C 编 译 器 的 GNU 版 本 : gcc 。 C 语 言 是 一 种 非 常 复 杂 的 语 言 , 拥 有 许 多 不 同 的 特 性 。 本 节 中 简 要描 述 了 C 语 言 中 的 基 本 组 件 , 并 使 用 这 些 组 件 创 建 了 一 个 有 用 的 程 序 例 子 。 本节 中 还 通 过 该 例 子 展 示 了 编 译 C 程 序 的 各 种 不 同 的 方 法 。

键 入 gcc 命 令 就 可 以 在 Linux 系 统 中 调 用 G N U C 编 译 器 。 gcc 命 令 将 一 次调 用 4 个 其 它 的 组 件 。 第 一 个 组 件 为 预 编 译 器 。 预 编 译 器 是 一 个 包 含 有 特 殊 预编 译 命 令 的 C 程 序 , 能 够 对 需 要 编 译 的 程 序 进 行 预 编 译 处 理 。 第 二 个 组 件 为 编译 器 。 编 译 器 会 对 经 过 预 编 译 处 理 的 程 序 进 行 编 译 , 生 成 相 应 的 汇 编 代 码 版 本 。第 三 个 组 件 为 汇 编 程 序 , 它 可 以 将 编 译 器 生 成 的 汇 编 代 码 汇 编 为 目 标 代 码 版 本 。最 后 一 个 组 件 为 连 接 程 序 , 它 的 功 能 是 将 目 标 代 码 连 接 为 可 执 行 程 序 。

该 可 执 行 程 序 的 默 认 文 件 名 为 "a.out" 。 一 般 来 说 , 应 该 使 用 参 数 指 定 自 己选 择 的 文 件 名 。 使 用 -o 选 项 可 以 将 文 件 名 作 为 参 数 使 用 。 这 样 , 连 接 程 序 会 使用 指 定 的 可 执 行 文 件 名 代 替 默 认 的 "a.out" 。 表 23-1 中 给 出 了 可 用 的 gcc 选 项 。下 面 的 例 子 使 用 gcc 对 greet.c 程 序 进 行 编 译 , 注 意 此 时 指 定 了 可 执 行 文 件 的 文件 名 为 "greet" 。 在 Linux 系 统 中 可 以 直 接 键 入 可 执 行 文 件 的 文 件 名 运 行 该 文 件 。

$ gcc greet.c -o greet

$ greet

Hello, how are you

在 使 用 多 个 文 件 构 成 的 程 序 时 , 必 须 注 意 C 编 译 器 和 连 接 程 序 的 区 别 。 C 编 译 器 的 目 的 是 生 成 目 标 代 码 文 件 , 而 连 接 程 序 的 目 的 是 使 用 目 标 代 码 文 件 生成 可 执 行 文 件 。 C 编 译 器 单 独 对 每 一 个 源 代 码 文 件 进 行 编 译 , 生 成 多 个 对 应 的

目 标 代 码 文 件 , 这 些 目 标 代 码 文 件 的 扩 展 名 为 .o 而 不 再 是 .c 。 只 需 要 在 gcc 后列 出 文 件 名 就 可 以 使 用 同 一 个 gcc 命 令 编 译 并 连 接 多 个 文 件 。 在 下 面 的 例 子 中 , 用 户 使 用 gcc 命 令 对 bookrecs 程 序 进 行 编 译 。 -o 选 项 指 定 了 可 执 行 文 件 的 文件 名 。

$ gcc main.c io.c -o bookrecs

使 用 gcc 命 令 也 可 以 只 完 成 连 接 工 作 , 具 体 作 法 是 在 参 数 列 表 中 只 列 出 目标 代 码 文 件 的 文 件 名 。 目 标 代 码 文 件 的 扩 展 名 为 .o 。 下 面 的 例 子 就 只 进 行 了 一次 连 接 操 作 , 而 没 有 编 译 操 作 发 生 。 当 然 , 在 执 行 连 接 工 作 前 必 须 首 先 生 成 相应 的 目 标 代 码 文 件 。

$ gcc main.o io.o

在 开 发 、 调 试 程 序 时 , 需 要 经 常 对 源 代 码 文 件 进 行 修 改 , 然 后 重 新 编 译 以查 看 运 行 效 果 。 如 果 程 序 由 多 个 文 件 组 成 且 修 改 只 涉 及 到 少 量 的 文 件 , 每 次 都对 所 有 文 件 进 行 编 译 是 非 常 不 经 济 的 。 那 些 没 有 修 改 过 的 文 件 不 需 要 重 新 编 译 , 只 需 要 进 行 一 次 连 接 工 作 即 可 。 将 源 代 码 和 目 标 代 码 文 件 同 时 作 为 gcc 的 参 数列 出 就 可 以 完 成 这 项 工 作 。 源 代 码 文 件 的 扩 展 名 为 .c , 目 标 代 码 文 件 的 扩 展 名为 .o 。 gcc 将 对 列 出 的 源 代 码 文 件 进 行 编 译 , 然 后 连 接 所 有 的 目 标 代 码 文 件 。样 就 可 以 只 对 修 改 过 的 少 量 文 件 进 行 编 译 ,提高了效率。例如 ,如 果 只 是 main.c 发 生 了 变 化 , io.c 没 有 变 化 , 就 应 该 在 gcc 的 参 数 中 指 定 源 代 码 文 件 main.c 和目 标 代 码 文 件 io.o 。 这 样 就 不 会 重 新 编 译 io.c 文 件 。

$ gcc main.c io.o -o bookrecs

ELF 和 a.out 二 进 制 格 式

可 执 行 文 件 之 类 的 二 进 制 文 件 存 在 两 种 格 式 。 第 一 种 是 UNIX 和 Linux 早 期使 用 的 a.out 格 式 , 该 名 称 来 自 UNIX C 编 译 器 的 默 认 可 执 行 文 件 名 。 由 于 后 来引 入 了 共 享 库 的 概 念 , a.out 格 式 的 文 件 在 实 现 上 遇 到 了 困 难 , 使 a.out 格 式 的可 执 行 文 件 使 用 共 享 库 是 一 种 非 常 复 杂 的 事 情 。 因 此 , 后 来 在 UNIX System 5 release 4 for Solaris 版 本 中 又 推 出 了 一 种 新 的 可 执 行 文 件 格 式 , 即 可 执 行 连 接格 式 (Executable and Linking Forma t, ELF )。 该 格 式 可 以 很 方 便 地 实 现 库 的 共享 。

Linux 系 统 中 随 后 也 采 用 ELF 格 式 作 为 可 执 行 程 序 的 标 准 格 式 。 gcc 编 译 器生 成 的 所 有 二 进 制 文 件 都 采 用 ELF 格 式 ( 尽 管 默 认 的 文 件 名 仍 然 为 a.out) 。 但 老的 使 用 a.out 格 式 的 程 序 仍 然 可 以 在 这 些 系 统 中 运 行 。

C + + 和 Ob jective C: g + +

gcc 也 是 一 个 C + + 程 序 编 译 器 。它 可 以 读 入 并 编 译 任 何 C + + 程 序 。但 gcc 不 能 自 动 与 C + + 类 库 进 行 连 接 , 必 须 在 命 令 行 上 指 定 使 用 的 C + + 类 库 。 使用 g + + 就 可 以 自 动 地 调 用 gcc 编 译 器 并 将 其 与 C + + 类 库 进 行 连 接 。 C + + 源代 码 文 件 的 扩 展 名 与 一 般 的 C 程 序 不 同 , 下 面 列 出 的 扩 展 名 都 可 以 作 为 C + + 源 代 码 文 件 的 扩 展 名 : C , cc, cxx, cpp。 除 此 之 外 , C + + 程 序 的 编 译 过 程 与 C

语 言 程 序 完 全 相 同 。 下 面 的 例 子 将 对 C + + 程 序 myprog.cpp 进 行 编 译 。

$ g + + m yprog.cpp -o myprog

gcc 编 译 器 也 提 供 对 Objective-C 程 序 的 支 持 。 Objective-C 也 是 一 种 面 向对 象 的 C 语 言 , 它 起 先 是 为 NeXt 系 统 设 计 的 。 在 使 用 gcc 命 令 对 Ob jecticve- C 程 序 进 行 编 译 时 , 需 要 使 用 -lobjc 选 项 。 -lobjc 选 项 将 使 用 Objective-C 类 库 , libobjc.so , 进 行 连 接 。

其 它 编 译 器 : Pasca l、 ADA 、 Lisp 和 Fortran

Linux 系 统 中 还 提 供 了 许 多 对 其 它 编 程 语 言 的 支 持 。 这 些 编 译 器 都 可 以 在OpenLinux 光 盘 上 找 到 。 除 了 C 和 C + + 外 , 还 可 以 对 Pasca l、 ADA 、 Lisp 和 Fortran 编 写 的 程 序 进 行 编 译 。 一 般 来 说 , 编 译 过 程 仍 然 由 gcc 程 序 处 理 , 该 程 序 可 以 辨 别 出 各 种 编 程 语 言 的 源 程 序 格 式 。 例 如 , G77 是 GNU 版 本 的Fortran 编 译 器 。 该 程 序 也 集 成 在 gcc 编 译 器 中 。 g77 命 令 将 调 用 gcc 编 译 器 对Fortran 程 序 进 行 编 译 。ADA 95 的 编 译 器 名 为 gna t。ADA 的 信 息 文 件 提 供 了 gnat 的 详 细 信 息 。 使 用 gnatmake 命 令 可 以 对 ADA 程 序 进 行 编 译 。

创 建 和 使 用 库 : 静 态 、 共 享 和 动 态

C 语 言 中 有 一 些 函 数 不 需 要 经 常 进 行 编 译 , 有 一 些 函 数 也 可 以 在 多 个 文 件

中 使 用 。 一 般 来 说 , 这 些 函 数 都 会 执 行 一 些 标 准 任 务 , 如 数 据 库 输 入 / 输 出 操 作或 屏 幕 控 制 等 。 可 以 事 先 对 这 些 函 数 进 行 编 译 , 然 后 将 它 们 放 置 在 一 些 特 殊 的目 标 代 码 文 件 中 , 这 些 目 标 代 码 文 件 就 称 为 库 。 库 文 件 中 的 函 数 可 以 通 过 连 接程 序 与 应 用 程 序 进 行 连 接 。 这 样 就 不 必 在 每 次 开 发 程 序 时 都 对 这 些 通 用 的 函 数进 行 编 译 了 。

不 同 类 型 的 应 用 程 序 将 会 使 用 不 同 的 函 数 库 。 例 如 , libdbm 库 中 组 包 含 了对 数 据 库 文 件 进 行 访 问 的 dbm 函 数 , 需 要 对 数 据 库 进 行 操 作 的 程 序 就 会 与 该 库进 行 连 接 。 数 学 应 用 程 序 将 使 用 数 学 库 libm , X-Windows 应 用 程 序 将 使 用 Xlib 库 , libX11 。 另 外 , 所 有 的 程 序 都 将 使 用 标 准 的 C 函 数 库 , lib c, 该 库 中 包 含 了诸 如 内 存 管 理 或 输 入 输 出 操 作 的 基 本 函 数 ( 最 近 将 会 推 出 GNU libc 库 的 2.0 版本 ) 这 些 库 都 存 放 在 /usr/lib 这 些 系 统 公 用 的 目 录 中 , 系 统 中 的 任 何 用 户 都 可 以 利用 这 些 库 。 当 然 用 户 也 可 以 建 立 自 己 专 用 的 库 函 数 , 供 自 己 或 其 它 指 定 的 人 员使 用 。

库 可 以 有 三 种 使 用 的 形 式 : 静 态 、 共 享 和 动 态 。 静 态 库 的 代 码 在 编 译 时 就已 连 接 到 开 发 人 员 开 发 的 应 用 程 序 中 , 而 共 享 库 只 是 在 程 序 开 始 运 行 时 才 载 入 , 在 编 译 时 , 只 是 简 单 地 指 定 需 要 使 用 的 库 函 数 。 动 态 库 则 是 共 享 库 的 另 一 种 变化 形 式 。 动 态 库 也 是 在 程 序 运 行 时 载 入 , 但 与 共 享 库 不 同 的 是 , 使 用 的 库 函 数不 是 在 程 序 运 行 开 始 , 而 是 在 程 序 中 的 语 句 需 要 使 用 该 函 数 时 才 载 入 。 动 态 库可 以 在 程 序 运 行 期 间 释 放 动 态 库 所 占 用 的 内 存 , 腾 出 空 间 供 其 它 程 序 使 用 。 由于 共 享 库 和 动 态 库 并 没 有 在 程 序 中 包 括 库 函 数 的 内 容 , 只 是 包 含 了 对 库 函 数 的引 用 , 因 此 代 码 的 规 模 比 较 小 。

已 经 开 发 的 大 多 数 库 都 采 取 共 享 库 的 方 式 。 ELF 格 式 的 可 执 行 文 件 使 得 共享 库 能 够 比 较 容 易 地 实 现 ,当 然 使 用 旧 的 a.out 模 式 也 可 以 实 现 库 的 共 享 。Linux 系 统 中 目 前 可 执 行 文 件 的 标 准 格 式 为 ELF 格 式 。

GNU 库 的 使 用 必 须 遵 守 Library GNU Public License(LGPL 许 可 协 议 )。 该协 议 与 GNU 许 可 协 议 略 有 不 同 ,开 发 人 员 可 以 免 费 使 用 GNU 库 进 行 软 件 开 发 , 但 必 须 保 证 向 用 户 提 供 所 用 的 库 函 数 的 源 代 码 。

系 统 中 可 用 的 库 都 存 放 在 /usr/lib 和 /lib 目 录 中 。 库 文 件 名 由 前 缀 lib 和 库 名以 及 后 缀 组 成 。 根 据 库 的 类 型 不 同 , 后 缀 名 也 不 一 样 。 共 享 库 的 后 缀 名 由 .so 和版 本 号 组 成 , 静 态 库 的 后 缀 名 为 .a 。 采 用 旧 的 a.out 格 式 的 共 享 库 的 后 缀 名为 .sa 。

libname.so.major.minor libname.a

这 里 的 name 可 以 是 任 何 字 符 串 , 用 来 唯 一 标 识 某 个 库 。 该 字 符 串 可 以 是

  • 个 单 字 、 几 个 字 符 、 甚 至 一 个 字 母 。 数 学 共 享 库 的 库 名 为 libm.so.5 , 这 里 的标 识 字 符 为 m , 版 本 号 为 5 。 libm.a 则 是 静 态 的 数 学 库 。 X- W indows 库 名 为libX11.so.6 , 这 里 使 用 X11 作 为 库 的 标 识 , 版 本 号 为 6 。

使 用 gcc 编 译 器 就 可 以 将 库 与 自 己 开 发 的 程 序 连 接 起 来 。 例 如 , libc.so.5 中 包 含 了 标 准 的 输 入 输 出 函 数 , 当 连 接 程 序 进 行 目 标 代 码 连 接 时 会 自 动 搜 索 该程 序 并 将 其 连 接 到 生 成 的 可 执 行 文 件 中 。 标 准 的 输 入 输 出 库 中 包 含 了 许 多 基 本的 输 入 输 出 函 数 , 如 printf 函 数 等 。 也 可 以 连 接 其 它 的 一 些 系 统 函 数 库 , 如 数学 库 等 , 但 与 libc.so.5 不 同 , 大 部 分 其 它 的 系 统 库 需 要 在 命 令 行 中 显 式 指 定 所

用 的 库 名 。

在 /usr/lib 和 /lib 目 录 中 可 以 找 到 绝 大 多 数 的 共 享 库 。 连 接 时 将 首 先 搜 索 这 两个 目 录 。 有 一 些 库 也 可 能 存 放 在 特 定 的 目 录 中 , 在 /etc/ld.conf 配 置 文 件 中 给 出了 这 些 目 录 的 列 表 。 连 接 程 序 也 会 对 列 出 的 这 些 目 录 进 行 搜 索 。 在 默 认 情 况 下 , Linux 将 首 先 搜 索 指 定 库 的 共 享 版 本 , 如 果 找 不 到 , 才 会 去 搜 索 静 态 版 本 。 在对 共 享 库 进 行 更 新 或 安 装 新 库 后 , 必 须 运 行 ldconfig 命 令 更 新 /etc/ld.conf 文 件中 相 应 的 项 ( 如 果 使 用 RPM 包 进 行 安 装 , 一 般 会 自 动 进 行 更 新 , 不 过 也 不 能 保证 这 一 点 )

在 gcc 编 译 器 中 引 用 可 搜 索 到 的 目 录 中 的 库 文 件 时 , 需 要 使 用 -l 选 项 和 库名 。 在 gcc 命 令 行 上 输 入 -lm 可 以 在 程 序 中 连 接 标 准 算 术 库 , -l 将 首 先 使 用libname.so 进 行 搜 索 , 这 里 是 libm.so 。 下 面 的 例 子 将 使 用 算 术 库 创 建 bookrecs 程 序 , 请 注 意 这 里 的 -lm 选 项 。

$ gcc main.c io.c -o bookrecs -lm

系 统 中 还 有 一 些 其 它 可 用 的 库 , 常 用 的 是 libncurses.a 库 , 包 含 了 一 些 简 单的 鼠 标 移 动 例 程 。 在 命 令 行 中 使 用 -lncurses 选 项 引 用 libncurses.so 库 。 下 面的 例 子 同 时 调 用 了 数 学 和 光 标 库 。

$ gcc main.c io.c -o bookrecs -lm -lncurses

在 引 用 其 它 目 录 中 的 库 时 , 需 要 使 用 -Ldir 选 项 指 定 该 目 录 。 该 选 项 指 定 了搜 索 库 函 数 时 的 其 它 路 径 。 在 下 面 的 例 子 中 , 用 户 在 连 接 时 使 用 了 mydir 目 录中 的 my io.so 库 文 件 。

$ gcc main.c -o bookrecs -Lmydir -lmyio

gdb 符 号 调 试 器

gdb 是 Linux 系 统 上 的 符 号 调 试 器 。 如 果 应 用 程 序 运 行 中 出 了 问 题 , 就 可 以使 用 符 号 调 试 器 跟 踪 错 误 。 符 号 调 试 器 允 许 用 户 在 运 行 程 序 时 显 示 源 代 码 。 在调 试 过 程 中 可 以 在 特 定 的 位 置 停 止 运 行 , 显 示 变 量 的 内 容 。 使 用 符 号 调 试 器 甚至 可 以 检 查 特 定 地 址 或 栈 中 的 内 容 。

为 了 能 够 使 用 符 号 调 试 器 对 可 执 行 程 序 进 行 调 试 , 在 编 译 和 连 接 程 序 时 必

须 使 用 -g 选 项 。 下 面 的 例 子 可 以 编 译 适 合 符 号 调 试 器 进 行 调 试 的 程 序 。 在 可 执行 程 序 生 成 后 , 就 可 以 使 用 符 号 调 试 器 进 行 调 试 。

$ gcc -g main.c io.c

键 入 关 键 字 gdb 和 可 执 行 文 件 名 就 可 以 调 用 gdb 调 试 器 。 下 面 的 例 子 中 的可 执 行 文 件 名 为 a.ou t。

$ gdb a.out

键 入 gdb 命 令 就 可 以 进 入 调 试 器 环 境 , 此 时 的 提 示 符 由 Linux 提 示 符 ($ )变为 gdb 提 示 符 (gdb )。 在 gdb 调 试 器 中 键 入 run 命 令 可 以 运 行 指 定 的 程 序 。

(gdb) run

如 果 程 序 中 存 在 fopen 或 open 语 句 ,说 明 程 序 中 某 处 会 使 用 某 个 数 据 文 件 。这 样 gdb 需 要 知 道 数 据 文 件 的 文 件 名 , 在 输 入 run 命 令 时 , 应 输 入 数 据 文 件 的文 件 名 。

(gdb) run filename

在 调 试 过 程 结 束 后 , 使 用 q 或 quit 命 令 就 可 以 退 出 调 试 器 。

绝 大 多 数 的 gdb 命 令 都 可 以 使 用 命 令 的 第 一 个 字 母 进 行 等 价 操 作 。 键 入 r 与 键 入 run 命 令 等 价 , q 代 表 quit 命 令 , p 代表 print 命 令 , n 代 表 next 命 令 。表 23-2 中 列 出 了 可 用 的 gdb 命 令 。

使 用 print 命 令 和 变 量 名 可 以 查 看 该 变 量 的 内 容 。 下 面 的 例 子 就 可 以 显 示

count 变 量 的 内 容 。(gdb) print count 10

使 用 where 命 令 , 可 以 显 示 已 经 调 用 过 的 函 数 名 和 调 用 时 使 用 的 参 数 。 在

下 面 的 例 子 中 , 用 户 正 位 于 calc 函 数 中 , where 命 令 显 示 了 main 和 calc 函 数调 用 使 用 的 参 数 。

(gdb) where

#3calc(newcost = 2.0) at calc.c:25 #1main () at main.c:19 #20x8000455 in __crt_dummy__ ()

使 用 info locals 命 令 可 以 列 出 当 前 函 数 中 定 义 的 所 有 变 量 和 参 数 的 值 。 下

面 的 例 子 就 显 示 了 所 有 定 义 的 变 量 的 值 。

(gdb) info locals cost =2

name = "Richard\000\000"

count = 10

count2 = 10

nameptr = 0x8000570 "petersen" countptr = (int *) 0xbffffde8

可 以 使 用 break 命 令 在 程 序 中 设 置 断 点 。 当 程 序 运 行 到 断 点 时 程 序 将 自 动

停 止 。 然 后 , 用 户 就 可 以 使 用 next 或 step 命 令 逐 行 运 行 程 序 , 也 可 以 随 时 使用 cont 命 令 运 行 到 下 一 个 断 点 处 。

xxgdb

xxgdb 是 gdb 调 试 器 的 X-Windows 版 本 ,它 由 一 些 垂 直 放 置 的 子 窗 口 组 成 。在 初 始 状 态 下 , 将 显 示 5 个 窗 口 。 最 上 面 的 子 窗 口 称 为 文 件 窗 口 , 在 窗 口 中 将显 示 正 在 进 行 调 试 的 文 件 名 。 下 面 是 显 示 源 代 码 文 件 的 源 程 序 窗 口 , 在 窗 口 左边 的 滚 动 条 可 以 滚 动 显 示 窗 口 中 的 内 容 。 源 程 序 窗 口 下 是 显 示 gdb 状 态 和 错 误消 息 的 消 息 窗 口 。 最 底 部 的 子 窗 口 称 为 对 话 窗 口 , 可 以 用 来 输 入 gdb 命 令 并 显示 命 令 返 回 的 结 果 。 窗 口 左 边 的 滚 动 条 允 许 用 户 查 询 已 输 入 的 命 令 和 返 回 的 结果 。 最 后 一 个 窗 口 为 命 令 窗 口 , 在 该 窗 口 中 使 用 按 钮 列 出 了 可 用 的 gdb 命 令 。当 执 行 run 或 step 命 令 时 , 只 需 要 单 击 相 应 的 按 钮 即 可 。

编 程 工 具

Linux 系 统 中 存 在 许 多 编 程 工 具 , 可 以 帮 助 开 发 人 员 准 备 和 组 织 源 代 码 文件 。 indent 应 用 程 序 可 以 使 用 特 定 的 格 式 对 源 代 码 文 件 中 的 语 句 块 进 行 缩 进 处

理 , 使 程 序 易 于 阅 读 。 cproto 应 用 程 序 可 以 根 据 文 件 中 的 所 有 函 数 定 义 生 成 头文 件 中 使 用 的 函 数 声 明 。 f2c 和 p2c 程 序 可 以 分 别 将 Fortran 程 序 和 Pascal 程序 翻 译 为 相 应 的 C 语 言 程 序 。 xwpe 是 一 个 类 似 Turbo-C 的 提 供 C 编 程 环 境 的X-Windows 应 用 程 序 。 还 有 其 它 的 一 些 应 用 工 具 , 可 以 在 Development 下 的Linux Applications and Utilities 页 下 找 到 相 应 的 说 明 。

在 软 件 开 发 完 成 后 , 需 要 生 成 软 件 的 发 行 版 本 。 一 般 情 况 下 , 可 以 将 开 发出 的 程 序 压 缩 成 一 个 tar 文 件 , 用 户 可 以 从 网 络 上 下 载 该 文 件 并 将 其 解 压 。 注意 在 提 供 软 件 时 , 应 该 提 供 详 细 的 安 装 和 使 用 文 档 , 并 说 明 技 术 支 持 文 档 和 函数 库 的 存 放 位 置 。 如 果 提 供 源 代 码 文 件 , 可 能 还 需 要 告 诉 用 户 如 何 对 源 代 码 进行 修 改 , 以 使 其 能 够 适 合 不 同 的 系 统 。

Redhat Package Manager(RPM ) 和 Autoconf 是 为 自 动 安 装 而 设 计 的 。Autoconf 可 以 根 据 指 定 的 系 统 对 源 代 码 进 行 设 定 , RPM 则 可 以 自 动 地 将 软 件 、支 持 文 档 、 函 数 库 和 支 持 程 序 安 装 在 指 定 的 目 录 。 这 两 个 应 用 程 序 都 有 非 常 复杂 和 强 大 的 功 能 , 可 以 对 最 复 杂 的 程 序 进 行 处 理 。 一 些 Linux 发 行 版 本 ( 如Redhathe Caldera )支 持 RPM 软 件 包 。

开 发 工 具

应 用 程 序 是 编 程 人 员 使 用 编 程 语 言 创 建 的 可 执 行 程 序 。 Linux 提 供 了 一 些 应用 程 序 可 以 控 制 应 用 程 序 的 开 发 过 程 。 在 这 些 程 序 中 最 重 要 的 是 make 工 具 ,

它 可 以 方 便 有 效 地 对 程 序 进 行 维 护 和 编 译 。 RCS 应 用 程 序 使 开 发 人 员 能 够 较 好地 控 制 程 序 的 修 改 。 它 将 程 序 的 修 改 储 存 在 文 件 的 不 同 版 本 中 , 这 样 可 以 保 证修 改 的 正 确 性 和 有 效 性 。 甚 至 可 以 使 用 man 工 具 为 自 己 开 发 的 程 序 建 立 自 己 的在 线 帮 助 文 档 。 所 有 这 些 工 具 的 功 能 都 非 常 复 杂 而 强 大 。

make 应 用 程 序

一 般 来 说 , 软 件 程 序 的 开 发 会 涉 及 到 许 多 源 代 码 文 件 。 在 开 发 程 序 时 , 需要 反 复 地 对 文 件 进 行 修 改 和 编 译 。 但 在 编 译 时 只 需 要 对 那 些 修 改 过 的 文 件 进 行编 译 。 连 接 程 序 会 将 新 编 译 的 修 改 过 的 文 件 和 已 编 译 的 未 修 改 过 的 文 件 进 行 连接 , 生 成 新 的 可 执 行 文 件 。 这 样 , 就 使 编 译 器 的 工 作 大 大 减 轻 , 不 需 要 重 新 对每 一 个 源 文 件 进 行 编 译 。

在 大 软 件 的 开 发 过 程 中 , 跟 踪 文 件 的 修 改 状 况 , 确 定 某 个 源 代 码 文 件 是 否修 改 过 是 一 件 并 不 容 易 的 事 情 。 make 应 用 程 序 可 以 帮 助 用 户 完 成 这 项 任 务 。make 就 是 为 大 工 程 中 经 常 修 改 的 源 文 件 而 设 计 的 , 它 可 以 记 录 每 个 文 件 的 修改 过 程 。 然 后 只 对 修 改 过 的 文 件 进 行 编 译 , 并 连 接 成 新 的 可 执 行 文 件 , 确 保 编译 连 接 工 作 的 有 效 性 和 效 率 。 在 下 面 的 例 子 中 , 用 户 键 入 make 命 令 调 用 make 应 用 程 序 。 然 后 make 将 编 译 已 被 修 改 的 文 件 然 后 生 成 新 的 可 执 行 文 件 。 make 将 显 示 每 一 条 执 行 的 Linux 命 令 。

$ make

cc -c main.c

cc -c io.c

cc main.o io.o

make 程 序 是 使 用 源 代 码 文 件 的 时 间 戳 决 定 是 否 需 要 对 其 进 行 编 译 的 。 当 文件 创 建 或 修 改 时 , Linux 操 作 系 统 将 会 对 文 件 相 应 的 时 间 戳 进 行 修 改 。 如 果 文件 创 建 于 1:00 , 则 该 文 件 的 时 间 戳 为 1:00 。 如 果 随 后 在 6:00 对 文 件 进 行 了 修改 , 文 件 的 时 间 戳 也 会 修 改 为 6:00 。 当 重 新 对 程 序 进 行 编 译 时 , 只 有 那 些 被 修改 的 文 件 , 也 就 是 说 , 相 应 的 时 间 戳 在 旧 的 可 执 行 文 件 之 后 的 文 件 才 会 被 重 新编 译 。 make 重 新 就 是 这 样 实 现 选 择 性 编 译 的 。

make 程 序 使 用 相 关 行 指 定 文 件 中 的 相 关 关 系 。 编 译 过 程 中 , 源 程 序 代 码 文件 编 译 成 目 标 代 码 文 件 , 然 后 再 连 接 为 可 执 行 程 序 。 因 此 , 可 以 说 可 执 行 程 序依 赖 于 目 标 代 码 文 件 , 进 一 步 依 赖 于 源 代 码 文 件 。 所 以 需 要 在 相 关 行 中 指 定 源代 码 文 件 和 目 标 代 码 文 件 的 依 赖 关 系 , 以 及 可 执 行 程 序 和 目 标 代 码 文 件 的 依 赖关 系 。

可 以 将 相 关 行 看 作 一 种 条 件 语 句 , 相 关 关 系 即 为 测 试 表 达 式 。 如 果 目 标 代码 文 件 所 依 赖 的 源 代 码 文 件 被 修 改 , 相 当 于 测 试 表 达 式 为 真 , 该 文 件 将 重 新 进行 编 译 。 不 过 , 相 关 行 的 语 法 比 一 般 标 准 的 条 件 测 试 语 句 略 为 复 杂 一 些 , 相 关行 包 括 三 个 组 件 : 目 标 文 件 , 所 依 赖 的 文 件 列 表 和 需 要 执 行 的 Linux 命 令 。 如果 目 标 文 件 所 依 赖 的 文 件 列 表 中 最 近 修 改 过 , 就 会 执 行 指 定 的 Linux 命 令 。 目标 文 件 和 所 依 赖 的 文 件 写 在 同 一 行 上 , 中 间 采 用 冒 号 分 隔 。 相 应 的 Linux 命 令可 以 放 在 同 一 行 上 , 使 用 分 号 和 前 面 的 内 容 分 开 , 也 可 以 放 在 下 一 行 上 , 但 在命 令 前 应 该 有 一 个 制 表 符 。 如 果 需 要 , 可 以 列 出 多 个 Liunx 命 令 , 在 相 关 行 后

应 有 一 空 行 标 志 该 相 关 行 的 结 束 。 在 下 面 的 例 子 中 , Linux 命 令 调 用 cc 编 译 器 , 对 源 代 码 文 件 进 行 编 译 或 对 目 标 代 码 文 件 进 行 连 接 。 相 关 行 的 语 法 如 下 :

目 标 文 件 : 相 关 文 件 ; Linux 命 令空 行

目 标 文 件 : 相 关 文 件制 表 符 Linux 命 令

空 行

在 下 面 的 makefile 文 件 中 , 对 包 含 两 个 源 代 码 文 件 main.c 和 io.c 的 C 程序 创 建 了 相 关 行 。 在 这 样 一 个 两 文 件 的 程 序 中 , 实 际 上 存 在 五 个 文 件 需 要 管 理 。对 应 于 每 一 个 .c 文 件 都 存 在 一 个 .o 文 件 ,然 后 还 存 在 一 个 可 执 行 文 件 bookrecs 。目 标 代 码 文 件 (.o) 依 赖 于 源 代 码 文 件 (.c) , 而 可 执 行 文 件 则 依 赖 于 多 个 目 标 代 码文 件 。 在 这 个 例 子 中 , bookrecs 可 执 行 文 件 依 赖 于 两 个 目 标 代 码 文 件 main.o 和 io.o 。 每 一 个 目 标 代 码 文 件 又 依 赖 于 一 个 源 代 码 文 件 , main.o 依 赖 于 ma in.c , io.o 依 赖 于 io.c 。

在 makefile 文 件 中 , 针 对 bookrecs , main.o 和 io.o 三 个 文 件 , 需 要 三 个相 关 行 。 注 意 这 里 对 程 序 的 编 译 和 连 接 操 作 分 别 位 于 不 同 的 相 关 行 。 bookrecs 行 的 命 令 为 连 接 两 个 目 标 代 码 文 件 , 生 成 新 的 可 执 行 文 件 , 它 只 进 行 连 接 操 作 。main.o 和 io.o 行 的 命 令 为 对 源 代 码 进 行 编 译 , 并 不 涉 及 到 连 接 过 程 。

makefile

bookrecs : main.o io.o

gcc main.o io.o -o bookrecs

main.o : main.c gcc -c main.c io.o : io.c

gcc -c io.c

修 改 控 制 系 统 : R C S

在 开 发 大 型 工 程 时 , 由 于 发 现 程 序 的 错 误 或 需 要 添 加 新 功 能 , 开 发 人 员 需要 不 断 地 对 源 代 码 文 件 进 行 修 改 。 有 时 对 程 序 的 修 改 会 带 来 一 些 新 的 错 误 。 如果 能 够 对 修 改 的 过 程 作 记 录 , 就 可 以 帮 助 开 发 人 员 定 位 错 误 的 产 生 过 程 。 修 改控 制 系 统 (Revision Control System, RCS )就 是 一 个 可 以 记 录 开 发 者 对 源 代 码 文件 修 改 过 程 的 Linux 应 用 程 序 。 RCS 可 以 提 供 一 套 程 序 修 改 前 的 版 本 , 便 于 开发 人 员 进 行 比 较 检 查 。

在 开 发 小 组 进 行 程 序 开 发 时 , RCS 就 非 常 有 用 了 。 小 组 中 的 每 一 个 开 发 人员 都 会 对 程 序 进 行 修 改 。 RCS 可 以 记 录 下 每 一 个 开 发 者 所 作 的 修 改 和 修 改 时间 , 甚 至 可 以 为 每 一 次 修 改 记 录 下 相 应 的 注 释 信 息 。

RCS 将 程 序 的 原 始 版 本 储 存 在 某 个 文 件 中 , 然 后 记 录 所 有 对 文 件 进 行 的 修改 。使 用 记 录 下 来 的 信 息 ,RCS 可 以 生 成 文 件 开 发 过 程 中 的 任 何 一 个 版 本 。RCS 并 不 真 正 储 存 所 有 的 版 本 文 件 , 它 只 是 使 用 原 始 版 本 和 记 录 下 的 修 改 信 息 来 生成 相 应 的 版 本 。 表 23-3 中 列 出 了 在 管 理 RCS 文 件 时 可 用 的 命 令 。

对 文 件 的 一 套 已 记 录 的 修 改 称 为 一 个 版 本 。 每 一 个 版 本 都 有 自 己 的 一 个 版

本 号 , 版 本 号 一 般 由 主 版 本 号 和 次 版 本 号 组 成 。 在 默 认 情 况 下 , 程 序 的 第 一 个版 本 的 版 本 号 为 1.1 。 其 后 继 版 本 则 依 次 对 次 版 本 号 进 行 增 加 , 如 1.2 、 1.3 等 。当 然 也 可 以 手 工 修 改 主 版 本 号 。

在 创 建 RCS 文 件 时 , 需 要 首 先 创 建 一 个 RCS 目 录 存 放 程 序 所 用 的 RCS 文件 。 然 后 使 用 ci 目 录 创 建 RCS 文 件 , ci 命 令 使 用 程 序 的 原 始 文 件 名 作 为 参 数 , 在 RCS 目 录 中 生 成 后 缀 名 为 ,v 的 RCS 文 件 。 main.c 文 件 的 RCS 文 件 名 为main.c,v 。 如 果 程 序 由 多 个 源 文 件 组 成 , 需 要 为 每 一 个 源 文 件 创 建 单 独 的 RCS 文 件 。 下 面 的 例 子 可 以 为 ma in.c 程 序 创 建 RCS 文 件 。

$ ci main.c

RCS/main.c,v <-- ma in.c

enter desciption, terminated with single '.' or end of file: NOTE: This is NOT the log message!

>> Bookrecs main program

>> .

initial revision : 1.1 done

在 使 用 RCS 对 源 代 码 文 件 进 行 编 辑 时 , 必 须 首 先 让 RCS 生 成 一 份 源 代 码文 件 的 复 件 。 该 复 件 与 RCS 文 件 名 相 同 , 但 没 有 ,v 后 缀 。 对 于 main.c,v 文 件 , RCS 将 生 成 一 个 名 为 ma in.c 的 文 件 。

使 用 co 命 令 可 以 生 成 源 代 码 文 件 的 一 个 复 件 。 co 命 令 可 以 使 用 许 多 选 项 , 不 带 任 何 选 项 的 co 命 令 将 生 成 一 个 只 读 的 复 件 , -l 选 项 则 可 以 生 成 一 个 可 以 编

辑 的 复 件 , 这 里 的 -l 表 示 锁 定 , 在 使 用 该 选 项 时 , 就 可 以 锁 定 RCS main.c,v 文件 。 其 它 的 开 人 员 此 时 将 不 能 对 该 文 件 进 行 访 问 , 这 样 就 确 保 了 在 某 一 时 刻 只能 有 一 个 开 发 人 员 对 程 序 进 行 修 改 。 在 对 程 序 的 修 改 完 成 后 , 需 要 对 所 作 的 修改 进 行 登 记 , 然 后 对 已 锁 定 的 文 件 解 锁 供 他 人 使 用 。 下 面 的 例 子 就 使 用 co 命 令生 成 了 源 代 码 文 件 main.c,v 的 可 编 辑 复 件 。

$ co -l main.c RCS/main.c,v --> main.c revision 1.1 (locked) done

在 源 代 码 文 件 修 改 完 成 后 , 可 以 使 用 ci 命 令 登 记 自 己 所 作 的 修 改 。 键 入 ci

命 令 和 RCS 文 件 名 , 命 令 将 提 示 用 户 输 入 动 修 改 所 作 的 注 释 。 RCS 将 自 动 为源 程 序 代 码 文 件 分 配 一 个 新 的 版 本 号 。 在 下 面 的 例 子 中 , 用 户 对 ma in.c 进 行 了修 改 , 在 存 盘 时 RCS 将 自 动 生 成 新 的 1.2 版 本 。

$ ci main.c RCS/main.c,v <-- main.c

new version: 1.2; previous revision: 1.1

enter log message, terminated with single '.' or end of file:

>> Added prompts

>> .

done

应 用 程 序 的 在 线 手 册 : man

在 开 发 Linux 下 的 程 序 时 , 一 般 应 该 提 供 相 应 的 文 档 资 料 。 如 果 该 程 序 是由 多 个 程 序 员 同 时 开 发 的 的 大 程 序 , 文 档 就 变 得 更 加 重 要 。 一 般 来 说 , 文 档 都采 取 手 册 的 形 式 , 对 程 序 中 的 不 同 命 令 和 特 点 进 行 描 述 。 对 于 用 户 和 开 发 人 员来 说 , 提 供 详 细 正 确 的 文 档 是 非 常 重 要 的 。 在 本 书 的 第 3 章 中 已 经 提 到 , 可 以使 用 man 命 令 显 示 Linux 命 令 的 有 关 信 息 , 它 提 供 了 命 令 的 在 线 手 册 功 能 。 开发 人 员 也 可 以 使 用 man 命 令 为 自 己 开 发 的 应 用 程 序 建 立 自 己 的 在 线 帮 助 文 档 。使 用 man 的 文 本 处 理 宏 命 令 就 可 以 生 成 这 些 文 档 , 然 后 可 以 使 用 man 命 令 进行 阅 读 。 当 键 入 man 命 令 和 文 档 名 时 , man 将 使 用 gnroff 对 该 文 档 进 行 格 式处 理 并 显 示 该 文 档 。 开 发 人 员 建 立 的 真 实 文 档 是 无 格 式 的 , 但 文 档 中 包 含 了 相应 的 man 宏 。 因 此 , 可 以 使 用 带 -man 选 项 的 gnroff 命 令 直 接 显 示 手 册 文 档 。下 面 的 两 个 例 子 都 将 显 示 ls 的 在 线 文 档 资 料 。

$ man ls

$ gnroff -man /usr/man/man1/ls | more

man 文 档 文 件

可 以 使 用 任 何 标 准 的 文 本 编 辑 器 建 立 man 文 档 文 件 。 文 本 文 件 的 文 件 名 为相 关 的 命 令 或 主 题 和 一 个 表 示 节 的 数 字 。 因 此 , who 命 令 的 帮 助 文 档 的 文 件 名

可 能 为 who.1 。 在 下 面 的 例 子 中 , bookrec 命 令 的 帮 助 文 档 名 为 bookrec.1 , 这里 的 1 表 示 第 1 节 。

man 帮 助 文 档 有 许 多 节 组 成 , 各 节 的 内 容 可 以 由 开 发 人 员 自 己 设 定 。 但 一般 来 说 , Linux 命 令 的 帮 助 文 档 都 将 有 以 下 几 节 : NAME 、 SYNOPSIS 和DESCRIPTION 。真 正 的 帮 助 文 档 是 没 有 格 式 的 ,但 在 文 档 中 包 含 有 相 应 的 man 宏 命 令 。 在 文 档 中 至 少 存 在 两 个 不 同 的 man 宏 : TH 和 SH 。 TH 命 令 可 以 指 定在 显 示 文 档 的 每 一 页 时 , 屏 幕 上 的 标 题 和 相 应 的 节 号 。 而 SH 命 令 则 用 来 指 定每 一 节 的 题 头 。 当 然 在 文 档 中 也 可 以 使 用 其 它 的 宏 , 如 PP 宏 用 来 进 行 段 落 格式 设 置 , IP 宏 用 来 实 现 缩 进 等 。 表 23-4 中 列 出 了 可 用 的 man 宏 命 令 。

宏 命 令 应 放 置 在 文 档 中 某 一 行 的 开 始 处 , 在 命 令 前 应 使 用 一 个 点 号 作 为 宏命 令 的 表 示 。 在 命 令 后 的 所 有 文 本 都 将 按 命 令 指 定 的 格 式 进 行 处 理 。 如 果 不 出现 下 一 个 宏 命 令 , 该 宏 命 令 就 一 直 有 效 。 有 些 宏 , 如 SH 和 TH 可 以 带 参 数 。参 数 应 与 宏 命 令 位 于 同 一 行 。 SH 的 参 数 指 定 节 的 名 字 , 下 面 即 为 该 节 的 内 容 。一 般 某 节 的 内 容 由 一 系 列 的 短 行 组 成 , man 将 自 动 对 其 进 行 格 式 处 理 。 下 面 的例 子 指 定 了 名 为 DESCRIPTION 的 节 。

.SH DESCRIPTION

mylistopt provides alternative ways of displaying your grocery list.

You can display it with numbers the list in a file.

man 帮 助 文 档 由 一 系 列 的 小 章 节 组 成 , 下 面 的 模 板 给 出 了 如 何 组 织 帮 助 文

档 的 办 法 。 Linux 命 令 的 在 线 帮 助 文 档 一 般 都 采 用 这 种 格 式 。

.TH COMMAND Section -number

.SH NAME

命 令 和 函 数 功 能 的 简 单 介 绍

.SH SYNOPSIS

命 令 和 选 项 。 每 一 个 选 项 都 用 括 号 进 行 封 装 。 本 节 有 时 也 称 为 SYNTAX 。

.SH DESCRIPTION

详 细 介 绍 命 令 和 各 选 项 的 意 义 , 可 以 使 用 PP 、 LP 和 IP 进 行 格 式 处 理 。

.SH OPTIONS

命 令 可 用 的 选 项 。

.SH EXAMPLES

如 何 使 用 命 令 的 例 子 。

.SH SEE ALSO

可 以 用 来 参 考 的 其 它 文 档 。

.SH DAGNOSTICS

对 不 正 常 输 出 的 描 述 。

.SH WARNINGS

使 用 该 命 令 可 能 带 来 的 危 险 后 果 。

.SH BUGS

可 能 出 现 的 错 误 。

在 章 节 的 文 本 中 , 可 以 使 用 其 它 一 些 宏 进 行 特 定 的 文 本 处 理 操 作 。 .PP 宏

命 令 开 始 新 的 一 段 , .IP 宏 对 随 后 的 文 本 进 行 缩 进 处 理 。 一 般 用 来 显 示 程 序 所 用的 选 项 。 .I 命 令 可 以 使 文 本 加 上 下 划 线 , .B 则 是 字 体 变 为 黑 体 。 .I 和 .B 选 项 都使 用 需 要 处 理 的 文 本 作 为 参 数 。一 般 来 说 ,NAME 节 中 的 命 令 名 和 选 项 应 使 用 .B 加 黑 , 用 到 的 其 它 命 令 则 应 使 用 .I 加 上 下 划 线 。 另 外 , 如 果 在 文 本 中 使 用 了 连字 符 , 应 在 连 字 符 前 加 上 一 个 反 斜 线 。

下 面 的 例 子 创 建 了 一 个 bookrec 程 序 的 在 线 文 档 。 注 意 这 里 对 文 本 进 行 格式 处 理 的 方 法 。

bookrec.1 --- man 文 档 文 件

.TH BOOKREC 1

.SH NAME

bookrec \-Input and display a book record

.SH SYBOPSIS

.B bookrec [\-t] [\-p] [\-f]

.SH DESCRIPTION

.I bookrec

allows the user to input a title and price for a book. Then both elements

of the record are displayed

.SH OPTIONS

.IP t

D isplay only the title

.IP p

D isplay only the price

.IP f

Save the record to a file

.SH DIAGNOSTICS

Date output has the form of m/d/y.

.SH BUGS

The program can onlu read and display one record.

.br

It does not as yet allow you to read records from a file.

.SH FILES

The command uses no special files.

.SH "SEE ALSO"

man 应 用 程 序 在 类 似 /usr/man 的 系 统 命 令 中 寻 找 指 定 的 帮 助 文 档 , 但 该 命令 下 实 际 上 并 不 存 在 这 些 文 档 文 件 , 在 该 命 令 下 存 在 的 是 一 些 称 为 节 目 录 的 子目 录 , 相 应 的 帮 助 文 档 都 存 放 在 这 些 子 目 录 下 。 子 目 录 名 由 man 和 章 节 号 数 字组 成 。 一 般 说 来 会 存 在 7 个 目 录 , 目 录 名 从 man1 到 man7 。 在 自 己 的 文 档 目录 中 , 子 目 录 的 数 目 没 有 限 制 , 但 必 须 存 在 man1 目 录 。

节 目 录 的 使 用 使 得 开 发 人 员 可 以 为 某 个 目 录 创 建 多 个 详 细 程 度 不 同 的 文档 。 例 如 , man1 目 录 中 的 文 档 可 能 只 是 目 录 一 般 的 介 绍 , 而 man7 目 录 中 则

可 能 会 给 出 所 有 宏 的 列 表 。 这 些 文 档 根 据 .TH 宏 指 定 的 章 节 号 存 放 在 指 定 的 目录 , 用 户 在 查 看 这 些 文 档 时 , 可 以 在 目 录 前 指 定 需 要 查 看 的 章 节 号 。 下 面 的 例子 将 显 示 bookrec 命 令 的 第 3 章 节 的 文 档 , 如 果 没 有 指 定 指 定 章 节 号 , 将 默 认显 示 第 1 节 的 内 容 。

$ man 3 bookrec

表 23-1gcc 应 用 程 序

gccgcc

应行文程连据

用文本序接后

程件替将为缀

。换汇可名

使预工编执判

用编作代行断

预译

。码文

编器编汇件件

译对译编

器 、 编 译 器 、 汇 编 程 序 和源 代 码 文 件 进 行 预 编 译 , 器 将 源 代 码 文 件 编 译 为 汇为 目 标 代 码 , 最 后 使 用 连gcc 可 以 使 用 各 种 类 型 的 文类 型

连只编接件

接进代程作

程行码序为

序一

。将参

生些然目数

成简后标

可单汇代它

执的编码根

.c C

.o

目 标 代 码 文 件

.s

汇 编 代 码 文 件

.C

C + + 文 件

.cpp C + + 文 件

选 项

-S

编 代 码 文 件 的 后 缀 名 为 .s

-P

-c

标 代 码 文 件 的 后 缀 名 为 .o

-g

生 成 可 执 行 文 件 的 调 试 版 本 , 供 符 号 调 试 器 使 用

-o

文 件 名 指 定 可 执 行 文 件 的 文 件 名 , 默 认 的 文 件 名 为 a.out

-O

-l

文 件 名 使 用 系 统 库 名 或 文 件 名 进 行 连 接 ; -l 选 项 必 须 放 在 源 代 码 文

件 和 目 标 代 码 文 件 之 后

表 23-2gdb 符 号 调 试 器

在 gbd 中 运 行 程 序

r

run

运 行 程 序

q

quit

退 出 gdb

显 示 变 量 和 参 数

p 变量

print 变 量

显 示 变 量 内 容

p & 变 量

print & 变 量

显 示 变 量 地 址

set var = 值

在 调 试 器 中 对 变 量 进 行

赋 值

where

显 示 函 数 调 用 情 况 以 及

使 用 的 参 数

info locals

显 示 已 定 义 的 变 量 和 参

显 示 行

l 行 号

list 行 号

显 示 指 定 行 号 开 始 的 源代 码

l 函 数

list 函 数

显 示 函 数 中 的 源 代 码

l 数 字 , 数 字

list 数 字 , 数 字

显 示 指 定 行 号 范 围 中 的

源 代 码

单 步 和 继 续 执 行

n

next

单 步 执 行 程 序

续 表

s

step

单 步 执 行 程 序

c

cont

继 续 执 行 程 序

设 置 和 删 除 断 点

b

break

在 当 前 行 设 置 断 点

break

行 在 指 定 行 设 置 断 点

break

函 数 在 指 定 函 数 的 第 一

行 设 置 断 点

info break

列 出 所 有 断 点

d 数 字

delete 数 字

删 除 断 点 , 必 须 指 定 需

要 删 除 的 断 点 号

delete

删 除 所 有 断 点

表 23-3RCS 应 用 程 序

RCS

修 改 控 制 系 统 (RCS ) 允 许 对 程 序 开 发 过 程 进 行 控 制 ; 使 用 RCS , 可 以保 留 程 序 开 发 过 程 中 的 所 有 版 本 ; RCS 将 记 录 程 序 的 修 改 过 程 ; RCS 文 件 由 ci 目 录 创 建 并 使 用 rcs 命 令 进 行 管 理 ; 使 用 co 命 令 可 以 检 索版 本 号 , 使 用 rcs -o 命 令 可 以 删 除 指 定 的 版 本

ci

ci 命 令 对 RCS 文 件 进 行 更 新 ,生 成 新 的 版 本 ;如 果 不 存 在 已 有 的 RCS

文 件 , cu 将 使 用 后 缀 ,v 创 建 该 文 件 ; 使 用 ci 命 令 储 存 编 辑 过 的 文 件 ; 储 存 的 同 时 将 生 成 新 的 版 本 号

$ ci main.c

选项

-r 版 本 该 选 项 允 许 开 发 人 员 指 定 版 本 号 $ci -r5.2 main.c

co

co 命 令 获 取 RCS 文 件 的 某 个 版 本 ; 如 果 没 有 选 项 , 该 命 令 将 返 回 一个 只 读 的 版 本 ; 如 果 没 有 指 定 版 本 号 , 将 返 回 最 新 的 版 本 选 项

-l 该 选 项 将 返 回 RCS 文 件 的 可 编 辑 版 本 , 锁 住 源 代 码 文 件 防 止 他 人对 其 进 行 修 改

$ co -l main.c

rcs

rcs 命 令 对 RCS 文 件 进 行 管 理 , 用 来 控 制 其 它 用 户 对 该 文 件 的 访 问

权 限 选 项

-a 用 户 名 使 指 定 的 用 户 能 够 访 问 特 定 的 RCS 文 件

$ rcs -arobert main.c

-e 用 户 名 取 消 指 定 的 用 户 访 问 特 定 的 RCS 文 件 的 权 限

续 表

$ rcs -erobert main.c

-l 版 本 号 锁 定 指 定 的 版 本 号 , 除 了 文 件 的 创 建 者 外 , 其 它 人 无 法 对 其访问

$ rcs -l2 main.c

-u 版 本 号 对 指 定 的 版 本 号 解 锁

$ rcs -u2 main.c

-L 版 本 号 锁 定 指 定 的 版 本 号 , 包 括 文 件 的 创 建 者 在 内 的 所 有 人 都 无 法

对 其 访 问

$ rcs -L2 main.c

-U 版 本 号 对 指 定 的 版 本 号 解 锁

$ rcs -U2 main.c

-o 版 本 号 从 RCS 文 件 中 删 除 指 定 的 版 本

$ rcs -o2.3 main.c

rlog

rlog 命 令 输 出 RCS 文 件 中 不 同 版 本 的 信 息 ; 如 果 不 使 用 任 何 参 数 , 将 显 示 每 一 个 版 本 的 简 要 信 息 选 项

-r 版 本 显 示 指 定 版 本 的 信 息

-d 日 期 显 示 在 指 定 日 期 创 建 的 版 本 的 信 息 ; 日 期 的 格 式 为 年 / 月 /日 ,

和小 时 : 分 : 秒 ;必 须 指 定 年 份 , 其 余 为 可 选 项

$ rlog -d93/04/12 main.c

-d< 显 示 指 定 日 期 前 创 建 的 版 本 的 信 息

续 表

$rlog -d<93/04/12 main.c

->d 显 示 指 定 日 期 后 创 建 的 版 本 的 信 息

$rlog ->d93/04/12 main.c

表 23-4man 命 令 和 创 建 在 线 帮 助 文 档 时 可 用 的 宏 命 令

man

搜 索 并 显 示 命 令 的 在 线 帮 助 文 档 ; 可 以 创 建 自 己 的 帮 助文 档 ; man 命 令 根 据 指 定 的 章 节 号 在 目 录 中 搜 索 文 档 ; 在 创 建 自 己 的 帮 助 目 录 时 , 应 同 时 创 建 相 应 章 节 的 子 目录

man 命 令 名

搜 索 并 显 示 指 定 命 令 的 在 线 帮 助 文 档

$man who

MANPATH

Shell 特 殊 变 量 , 保 存 了 man 命 令 将 自 动 搜 索 的 路 径 ;

可 以 使 用 赋 值 操 作 添 加 新 的 路 径 名

$MANPATH = $MANPATH:/$HOME/man

选 项

数 字

只 显 示 指 定 的 章 节

$ man 3 bookrec

-M 目 录 名

只 对 指 定 的 目 录 进 行 搜 索

$ man -M $HOME/man bookrec

man 宏 命 令

续 表

.TH 标 题 章 节 号

指 定 在 线 帮 助 文 档 的 标 题

.SH 章 节 号

指 定 章 节 的 题 头

.B 单 字

使 指 定 单 字 以 黑 体 显 示

.I 单 字

使 指 定 单 字 以 下 划 线 方 式 显 示

.IP 选项

段 落 缩 进 格 式 处 理 。 一 般 用 来 在 OPTIONS 节 中 显 示 选项 内 容

.PP

开 始 新 段 落