makefile笔记

上传人:第*** 文档编号:32689589 上传时间:2018-02-12 格式:DOC 页数:7 大小:52.50KB
返回 下载 相关 举报
makefile笔记_第1页
第1页 / 共7页
makefile笔记_第2页
第2页 / 共7页
makefile笔记_第3页
第3页 / 共7页
makefile笔记_第4页
第4页 / 共7页
makefile笔记_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《makefile笔记》由会员分享,可在线阅读,更多相关《makefile笔记(7页珍藏版)》请在金锄头文库上搜索。

1、 什 么 是 make?当 你 写 一 个 简 单 的 程 序 , 只 有 一 到 两 个 源 文 件 的 时 候 , 输 入% cc file1.c file2.c就 没 什 么 问 题 , 但 如 果 有 很 多 源 文 件 就 会 很 烦 人 编 译 的 时 间 也 会 很 长 。一 个 方 法 就 是 使 用 目 标 文 件 , 只 在 源 文 件 有 改 变 的 情 况 下 才 重 新 编 译 源 文 件 。因 此 你 可 以 这 样 做 :% cc file1.o file2.o . file37.c .上 次 编 译 后 , file37.c 发 生 了 改 变 , 但 其 他

2、文 件 没 有 。 这 样 做 可 以 让 编 译 过 程快 很 多 , 但 是 也 不 能 解 决 累 人 的 输 入 问 题 。或 者 我 们 可 以 使 用 一 个 shell script 来 解 决 输 入 问 题 , 但 是 也 需 要 重 新 编 译 所有 文 件 , 在 大 型 项 目 上 很 没 有 效 率 。如 果 有 成 百 上 千 的 源 文 件 的 话 怎 么 办 ? 如 果 我 们 在 与 很 多 人 合 作 写 程 序 , 别 人对 源 文 件 进 行 了 修 改 , 又 没 有 告 诉 你 , 该 怎 么 办 ?也 许 我 们 可 以 把 以 上 两 种 方 法

3、 结 合 , 写 一 种 像 shell script 一 样 的 东 西 。 这种 文 件 包 含 某 种 技 巧 可 以 决 定 什 么 时 候 该 对 源 文 件 进 行 编 译 。 现 在 所 有 我 们 要 的 就是 一 个 程 序 可 以 懂 得 这 种 技 巧 , 因 为 要 懂 得 这 种 技 巧 , shell 还 没 那 么 大 的 能 耐 。这 个 程 序 就 叫 make。 它 读 入 一 个 文 件 , 叫 makefile, 这 个 文 件 决 定 了 源 文件 之 间 的 依 赖 关 系 。 而 且 决 定 了 源 文 件 什 么 时 候 该 编 译 什 么 时

4、候 不 应 该 编 译 。 例 如 ,某 个 规 则 可 以 说 “ 如 果 fromboz.o 比 fromboz.c 要 旧 , 意 思 就 是 有 人 修 改 了 fromboz.c, 因 此 我 们 需 要 重 新 编 译 这 个 文 件 。 ”这 个 makefile 还 有 规 则 通 知 make 该 怎 么 重 新 编 译 源 文 件 , 因 此 make 是 一 个 强 大 得 多 的 工 具 。makefile 通 常 和 相 关 的 源 文 件 保 存 在 同 一 个 目 录 下 , 可 以 叫 做 makefile, Makefile 或 者 MAKEFILE。 大 多

5、 数 程 序 员 会 使 用 Makefile 这 个 名 字 ,因 为 这 样 可 以 让 这 个 文 件 被 放 在 目 录 列 表 的 顶 端 , 可 以 很 容 易 得 看 见 。使 用 make 的 例 子这 是 一 个 非 常 简 单 的 make 文 件 :foo: foo.ccc -o foo foo.c包 含 两 行 , 一 行 是 依 赖 关 系 , 一 行 是 执 行 动 作 。依 赖 关 系 的 那 一 行 包 含 了 程 序 的 名 字 (叫 做 target), 紧 跟 着 一 个 冒 号 , 然 后是 空 格 , 最 后 是 源 文 件 的 名 字 。 当 mak

6、e 读 入 这 一 行 的 时 候 , 会 检 查 foo 是 否存 在 ; 如 果 存 在 , 就 比 较 foo 和 foo.c 最 后 的 修 改 时 间 有 什 么 不 同 。 如 果 foo 不 存 在 , 或 者 比 foo.c 要 旧 , 就 检 查 执 行 动 作 那 一 行 看 看 该 怎 么 做 。 换 句 话 说 ,就 是 foo.c 需 要 重 新 编 译 的 时 候 该 怎 么 办 。执 行 动 作 那 一 行 以 一 个 tab (按 下 tab) 开 始 , 然 后 是 你 在 命 令 行 下 产 生 foo 所 执 行 的 命 令 。 如 果 foo 过 期 了

7、 , 或 者 不 存 在 , make 就 会 执 行 这 个 命 令 来 产生 foo。 换 句 话 说 , 这 就 是 重 新 编 译 foo.c 的 规 则 。 因 此 , 当 你 输 入 make 时 , 它 会 确 定 foo 和 foo.c 在 修 改 时 间 上 是 否 同 步 。这 个 原 则 可 以 在 Makefile 里 扩 展 到 成 百 上 千 的 目 标 文 件 上 实 际 上 , 在 FreeBSD 里 , 你 只 要 在 合 适 的 目 录 下 输 入 make world 就 可 以 编 译 整 个 操 作 系 统 !makefile 另 一 个 有 用 的

8、特 点 就 是 目 标 文 件 不 一 定 就 是 程 序 。 例 如 , 我 们 可 以 有 这 样 的 make 文 件 。foo: foo.ccc -o foo foo.cinstall:cp foo /home/me我 们 可 以 输 入 如 下 的 命 令 告 诉 make 该 执 行 哪 个 目 标 :% make targetmake 会 只 执 行 这 个 目 标 而 忽 略 其 他 的 目 标 。 例 如 , 如 果 我 们 输 入 make foo, 就 只 有 foo 被 执 行 , 必 要 的 情 况 下 重 新 编 译 foo 而 不 会 继 续 执 行 instal

9、l 这 个 目 标 。如 果 我 们 只 是 输 入 make 这 个 命 令 , make 总 会 寻 找 第 一 个 目 标 , 并 且 在 执行 完 以 后 就 不 管 其 他 的 目 标 了 。 例 如 , 如 果 我 们 输 入 make foo, make 就 会 转到 foo 这 个 目 标 , 在 必 要 的 情 况 下 重 新 编 译 foo, 而 不 会 执 行 install 目 标 , 然 后 就 停 止 了 。一 定 要 注 意 , install 这 个 目 标 不 依 赖 任 何 其 他 的 东 西 ! 这 意 味 着 我 们 一 旦 输 入 make insta

10、ll, 这 个 目 标 下 的 所 有 命 令 都 将 被 执 行 。 这 种 情 况 下 , foo 将 被 安 装 到用 户 的 家 目 录 下 。 应 用 程 序 的 makefile 正 是 这 样 写 的 , 以 便 程 序 在 正 确 编 译 后 可以 被 安 装 到 正 确 的 目 录 。要 尝 试 解 释 的 话 会 比 较 容 易 让 人 混 淆 。 如 果 你 不 太 懂 make 是 如 何 工 作 的 ,最 好 的 办 法 就 是 先 写 一 个 简 单 的 程 序 例 如 “hello world” 以 及 和 上 面 的 例 子 相 同 的 make 文 件 再 去

11、 实 验 。 然 后 再 进 一 步 , 使 用 多 个 源 文 件 , 或 者 让 你 的 源 文 件 包 含一 个 头 文 件 。 touch 命 令 在 这 里 就 非 常 有 用 了 它 能 让 在 不 改 变 文 件 内 容 的 情 况下 改 变 文 件 的 日 期 。Make 和 include-文 件C 源 码 的 开 头 经 常 有 一 系 列 被 包 含 的 头 文 件 , 例 如 stdio.h。 有 一 些 是 系 统 级的 头 文 件 , 有 一 些 是 你 正 在 写 的 项 目 的 头 文 件 :#include #include foo.hint main(.要

12、确 定 在 你 的 foo.h 被 改 变 之 后 , 这 个 文 件 也 会 被 重 新 编 译 , 就 要 在 你 的 Makefile 这 样 写 :foo: foo.c foo.h 当 你 的 项 目 变 得 越 来 越 大 , 你 自 己 的 头 文 件 越 来 越 多 的 时 候 , 要 追 踪 所 有 这 些头 文 件 和 所 有 依 赖 它 的 文 件 会 是 一 件 痛 苦 的 事 情 。 如 果 你 改 变 了 其 中 一 个 头 文 件 ,却 忘 了 重 新 编 译 所 有 依 赖 它 的 源 文 件 , 结 果 会 是 很 失 望 的 。 gcc 有 一 个 选 项 可

13、 以分 析 你 的 源 文 件 然 后 产 生 一 个 头 文 件 的 列 表 和 它 的 依 赖 关 系 : -MM。如 果 你 把 下 面 的 内 容 加 到 你 的 Makefile 里 面 :depend:gcc -E -MM *.c .depend然 后 运 行 make depend, 就 会 产 生 一 个 .depend, 里 面 包 含 了 目 标 文 件 , C 文 件 和 头 文 件 的 列 表 :foo.o: foo.c foo.h如 果 你 改 变 了 foo.h, 下 一 次 运 行 make 的 时 候 , 所 有 依 赖 foo.h 的 文 件就 会 被 重 新

14、 编 译 。每 一 次 你 增 加 一 个 头 文 件 的 时 候 , 别 忘 了 运 行 一 次 make depend。自动化编译一 makefile 规则 makefile 是一个 make 的规则描述脚本文件,包括四种类型行:目标行、命令行、宏定义行和 make 伪指令行(如“include” ) 。makefile 文件中注释以“#”开头。当一行写不下时,可以用续行符“” 转入下一行。 1.1 目标行 目标行告诉 make 建立什么。它由一个目标名表后面跟冒号“:” ,再跟一个依赖性表组成。 例: example: depfile deptarget 该目标行指出目标 example

15、 与 depfile 和 deptarget 有依赖关系,如果 depfile或 deptarget 有修改,则重新生成目标。 example1 example2 example3: deptarget1 deptarget2 depfile 该目标行指出目标名表中的 example1、example2 、example3 这三个各自独立的目标是用相同的依赖列表和规则生成的。 clean: 空的依赖列表说明目标 clean 没有其他依赖关系。 目标行后续的以 Tab 开始的行是指出目标的生成规则,该 Tab 字符不能以空格代替。例如: example.o:example.c example.h

16、 cc c example.c 该例子指出目标 example.o 依赖于 example.c 和 example.h。如果 example.c或 example.h 其中之一改变了,就需要执行命令 cc c example.c 重新生成目标 example.o。 可以用文件名模式匹配来自动为目标生成依赖表,如: prog: *.c 以下是一个简单的 makefile 的例子: 图 1 最简单的 makefile 例 make 使用 makefile 文件时,从第一个目标开始扫描。上例中的第一个目标为 all,所以目标 clean 不会自动被执行,可以通过命令 make clean 来生成目标。 1.2 命令行 命令行用来定义生成目标的动作。 在目标行中分号“;”后面的文件都认为是一个命令,或者一行以 Tab 制表符开始的也是命令。 如在上面的

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 职业教育

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号