第 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 |
开 始 新 段 落 |