10分钟教你学会Makefile

上传人:sha****en 文档编号:23447774 上传时间:2021-06-08 格式:PPT 页数:24 大小:194.50KB
返回 下载 相关 举报
10分钟教你学会Makefile_第1页
第1页 / 共24页
10分钟教你学会Makefile_第2页
第2页 / 共24页
10分钟教你学会Makefile_第3页
第3页 / 共24页
点击查看更多>>
资源描述
嵌 入 式 教 育 梅 方 靖Linux基础 Makfile Linux编译流程 编 译 流 程 :预 处 理 -编 译 -汇 编 -链 接 每 个 编 译 的 环 节 都 会 产 生 不 同 类 型 的 文 件 , 对 于 C程 序 :预 处 理 - .i文 件编 译 - .s文 件汇 编 - .o文 件 = .a文 件 .so文 件 链 接 - 可 执 行 文 件 每 个 环 节 都 有 自 己 的 依 赖 , 即 若 想 生 成 .o文 件 , 那 么 需要 .s、 .i、 .c文 件 。 Linux编译思考 对 于 庞 大 的 工 程 项 目 , 比 如 内 核 源 码 中 存 在 成 千 上 万 个 源 文 件 ,那 么 编 译 的 时 候 , 如 何 实 现 自 动 化 编 译 , 即 源 头 文 件 与 头 文 件或 者 静 、 动 态 库 之 间 找 到 彼 此 的 依 赖 关 系 进 行 编 译 , 最 终 生 成目 标 文 件 。 大 多 数 的 Winodws的 程 序 员 不 需 要 深 入 了 解 自 动 化 编 译 流 程 , 因为 Windows的 IDE(Integrated Development Environment)已 经 做了 相 关 的 工 作 ,比 如 VC, VB等 。 而 Linux下 没 有 这 样 的 IDE, 通 常需 要 程 序 员 做 用 脚 本 自 行 书 写 。 要 做 一 个 好 的 professional程 序 员 , 尤 其 是 linux程 序 员 , 至 少 需 要 懂 得 设 计 该 脚 本 - Makefile。 LinuxMakefile的介绍 认 识 Makefile和 make。 Makfile是 一 种 纯 文 本 的 编 译 脚 本 , 在 其 中 可 以 指 定 需 要 编 译 哪些 文 件 , 哪 些 先 编 译 , 哪 些 后 编 译 , 哪 些 需 要 重 新 编 译 , 最 终需 要 生 成 怎 么 样 的 应 用 程 序 。 make是 一 种 命 令 , 它 用 来 解 释 Makefile脚 本 , 并 根 据 脚 本 中 的指 定 内 容 , 进 行 操 作 。 LinuxMakefile的命名及执行方式 使 用 make命 令 执 行 Makefile文 件 。 在 默 认 情 况 下 , make会 执 行 当 前 目 录 下 的 Makefile文 件 。 若 当前 目 录 下 找 不 到 相 关 的 Makefile文 件 , 则 会 出 现 错 误 :make: * No targets specified and no makefile found. Stop. Makefile文 件 的 命 名 可 以 为 “ Makefile或 makefile。 如 果 使 用 非 标 准 命 名 的 makefile, 必 须 用 命 令 开 关 -f 或 “ -file”。参 数 “ -f ” 或 “ -file ”告 诉 make 读 入 name 作为 makefile文 件 。 LinuxMakefile的好处 Makefile带 来 的 好 处 “ 自 动 化 编 译 ” , 一 旦 写 好 , 只 需 要一 个 make命 令 , 整 个 工 程 完 全 自 动 编 译 , 极 大 的 提 高 了 软 件 开发 的 效 率 。 另 一 个 好 处 , 某 工 程 有 10万 个 源 文 件 , 如 果 其 中 某 一 个 源 文 件发 生 改 变 , 不 需 要 重 新 编 译 整 个 工 程 , 但 是 我 们 生 成 应 用 程 序前 需 要 将 所 有 的 源 文 件 生 成 .o文 件 。 makefile会 根 据 文 件 更 新时 间 而 判 断 , 是 否 需 要 重 新 编 译 源 文 件 成 .o文 件 , 在 生 成 应 用程 序 时 , 只 需 要 将 所 有 的 .o文 件 做 链 接 即 可 。 LinuxMakefile简单的练习 有 三 个 源 程 序 程 序 fun1.c : 程 序 fun2.c : 程 序 main.c: 使 用 gcc编 译 出 应 用 程 序 test:#gcc fun1.c fun2.c main.c -o test 接 下 来 , 我 们 使 用 Makefile来 写 一 个脚 本 。 LinuxMakefile简单的练习#sample makefile scriptCC=gccSRCS=fun1.c fun2.c main.cEXEC=testall: $(CC) $(SRCS) -o $(EXEC)编 写 完 后 , 保 存 , 在 当 前 目 录 下 执 行 make命 令 , 生 成 可 执 行 程 序 test LinuxMakefile的组成 Makefile里 主 要 包 含 了 五 种 类 型 的 语 句 :显 式 规 则 、 隐 式 规 则 、 变 量 定 义 、 文 件 指 示 、 注 释注 : Makefile中 可 以 直 接 调 用 shell命 令 。 显 式 规 则 : 显 式 规 则 说 明 了 如 何 生 成 一 个 或 多 的 的 目 标 文 件 。 这 是 由Makefile 的 书 写 者 明 显 指 出 , 要 生 成 的 文 件 , 文 件 的 依 赖 文 件 , 生成 的 命 令 隐 式 规 则 : 由 于 make有 自 动 推 导 的 功 能 , 所 以 隐 式 的 规 则 可 以 让 程 序 员 比 较 简 略 地 书 写 Makefile, 这 是 由 make所 支 持 ,例 如 , makefile发现 .o文 件 , 程 序 就 会 自 动 去 找 .c文 件 , 并 编 译 成 .o文 件 。 LinuxMakefile的组成 变 量 的 定 义 : 在 Makefile中 可 定 义 一 系 列 的 变 量 , 变 量 一 般 都 是 字 符串 , 当 Makefile被 执 行 时 , 其 中 的 变 量 都 会 被 扩 展 到 相 应 的 引 用 位 置上 文 件 指 示 : 包 括 了 三 个 部 分 。在 一 个 Makefile中 引 用 另 一 个 Makefile根 据 某 些 情 况 指 定 执 行 Makefile中 的 有 效 部 分定 义 一 个 多 行 的 命 令 。 注 释 : Makefile注 释 使 用 #, 若 Makefile需 要 用 到 “ #”, 则 需 要 做转 义 “ #”。 LinuxMakefile的组成#sample makefile scriptinclude other.makeCC=gccSRCS=fun1.c fun2.c main.cEXEC=testall: $(CC) $(SRCS) -o $(EXEC) 文 件 指 示 , 包 含 其 他 文 件 , 其 他 文 件 中 的 变 量 会 被 包 含 进 来CC, SRCS,EXEC为 变 量 , 都 是 字 符 串 , 使 用 时 会 完 全 被 替换 。 makefile命 令 部 份 , 变 量 在 被 引 用 时 需 要 加 上 $()或 者 $注 释 Makefile与 程 序 或 其 它 脚 执 行 顺 序 一 样 , 都 是 自 上 到 下 。引 用 未 定 义 的 变 量 时 , 不 会 出 错 , 但 其 值 为 空 , 即 什 么 都 没 有 。 LinuxMakefile的规则(命令) 规 则 解 释 如 何 编 译 文 件 , make根 据 依 赖 关 系 执 行 产 生 或 更 新 目 标 ; 规则 也 说 明 如 何 和 何 时 执 行 动 作 。 有 的 规 则 看 起 来 很 复 杂 , 但 都 符 合 下述 模 式 。: target是 一 个 目 标 文 件 , 可 以 是 可 执 行 文 件 或 .o文 件 , 也 可 以 是 执 行 动 作 。 depend targetdepend command makecommand 制 表 符 Tab键 注 : target depend command LinuxMakefile的工作原理 当 执 行 make的 时 候 , make程 序 从 当 前 目 录 读 入 makefile开 始 处 理 第 一 个 非 .的 规 则 , 这 称 作 缺 省 目 标 。 上 述 的 makefile中 , 缺 省 目 标 是 all, 由 于 目 标 all缺 少 depend, 所 以 这 个 规 则 中 的 命 令 会 被 直 接 执 行 。 在 执 行 make的 时 候 , 也 可 以 指 定 目 标 执 行 , 如 make clean, 那 么 make会 直 接读 入 执 行 目 标 clean,跳 过 all。 若 执 行 make all, 那 么 与 make 功 能 相 同 。#sample makefile scriptCC=gccSRCS=fun1.c fun2.c main.cEXEC=testall: $(CC) $(SRCS) -o $(EXEC)clean: rm -rf $(EXEC) LinuxMakefile的规则练习#makefile rule exampleA:B echo AB:C echo BC:D echo CD: echo D G: echo G分 别 执 行 make、 make B、 make G。 查 看 结 果 , 并 分 析 结 果 。 LinuxMakefile自动检测更新 工 程 若 干 个 源 文 件 中 , 某 一 个 文 件 发 生 了 改 变 , 我 们 希 望 只 重 新 编 译 被 修 改的 那 一 个 文 件 , 其 它 的 文 件 不 重 新 编 译 。 make在 执 行 时 , 会 确 认 所 有 target是 否 都 是 最 新 的 , 若 target的 某 一 个depend的 时 间 比 target新 , 那 么 make会 重 新 根 据 依 赖 关 系 来 执 行 相 应 的 命 令 。 对 于 例 子 中 的 Makefile, all没 有 依 赖 所 以 命 令 总 是 会 执 行 。 这 里 需 要 修 改Makefile #sample makefile scriptCC=gccSRCS=fun1.c fun2.c main.cEXEC=testall: $(CC) $(SRCS) -o $(EXEC)clean: rm -rf $(EXEC) LinuxMakefile自动检测更新#sample makefile scriptCC=gccOBJS=fun1.o fun2.o main.oEXEC=testall:$(OBJS)$(CC) $(OBJS) -o $(EXEC)fun1.o:fun1.c$(CC) -c fun1.c fun2.o:fun2.c$(CC) -c fun2.cmain.o:main.c$(CC) -c main.cclean: rm -rf $(EXEC) LinuxMakefile隐式规则 由 于 make有 自 动 推 导 的 功 能 , 所 以 隐 式 的 规 则 可 以 让 程 序 员 比 较 简 略地 书 写 Makefile。 make在 解 释 Makefile时 , 若 目 标 是 .o文 件 , 那 么 他 会 自 动 的 去 寻 找 相应 的 .c文 件 , 并 隐 式 的 进 行 编 译 。 LinuxMakefile隐式规则 - 简化2#sample makefile scriptCC=gccOBJS=fun1.o fun2.o main.oEXEC=testall:$(OBJS)$(CC) $(OBJS) -o $(EXEC)fun1.o:fun2.o: main.o:clean: rm -rf $(EXEC)简 化 2: 使 用 隐 式 规 则 , 目 标 文 件 为 .o文 件 , make自 动 推 导 搜 索 .c文 件 , 并 编 译 。 LinuxMakefile隐式声明 - 简化3#sample makefile scriptCC=gccOBJS=fun1.o fun2.o main.oEXEC=testall:$(OBJS)$(CC) $(OBJS) -o $(EXEC)clean: rm -rf $(EXEC) 简 化 3: 使 用 隐 式 规 则 , 目 标 的 依 赖 为 三 个 .o文 件 , fun1.o, fun2.o,main.o, make自 动 推 导 , 找 到 相 应 .c文 件 生 成 找 到 .o文 件 。 LinuxMakefile的变量替换 在 Makefile中 通 常 指 定 需 要 编 译 的 .c文 件 , 我 们 可 以 将 多 个 .c文 件 名 保存 在 变 量 SRCS中 , 再 定 义 另 一 个 变 量 OBJS使 其 保 存 .o文 件 名 。 我 们 可 以 直 接 使 用 变 量 的 替 换 方 式 , 将 SRCS中 的 .c字 符 串 替 换 成.o, 赋 值 OBJS变 量 。其 格 式 为 : foo = $(var:a=b), 将 var变 量 中 的 a替 换 成 b, 并 返 回 给 foo。 例 :SRCS = fun1.c fun2.c main.cOBJS = $(SRCS: .c=.o) 那 么 变 量 OBJS值 为 fun1.o fun2.o main.o LinuxMakefile优化#sample makefile scriptCC=gccSRCS=fun1.c fun2.c main.cOBJS=(SRCS:.c=.o)EXEC=testall:$(OBJS)$(CC) $(OBJS) -o $(EXEC) clean: rm -rf $(EXEC) LinuxMakefile的变量追加 在 定 义 一 个 变 量 之 后 , 我 们 可 以 继 续 在 变 量 后 面 加 上 新 的 值 。追 加 的 语 法 与 C语 言 中 复 合 运 算 的 “ +=”类 似 。如 :CFLAGS = -WallCFLAGS += -O2那 么 最 终 CFLAGS的 值 为 -Wall -O2 LinuxMakefile预定义变量 不 管 是 显 式 规 则 还 是 隐 式 规 则 , makefile都 有 一 些 预 定 义 的 变量 , 这 些 变 量 有 些 会 在 隐 式 规 则 中 自 动 带 入 , 有 些 则 是 约 定 俗成 的 具 有 特 殊 意 义 的 变 量 。 部 份 预 定 义 变 量 :CC : 编 译 器 类 型CFLAGS : 编 译 选 项 , 通 常 为 -O2 -Wall -I -LLDFLAGS : 额 外 链 接 库EXEC或 APP : 应 用 程 序 名SRCS : 源 代 码OBJS : 目 标 文 件 LinuxMakefile通用版(基本版)# makefile exampleCC=gccCFLAGS = -Wall -O2 CFLAGS += -I./ -L./LFLAGS = -lpthread -lm SRCS = fun1.c fun2.c main.cOBJS=$(SRCS:.c=.o)EXEC=test all:$(OBJS) $(CC) $(CFLAGS) $(OBJS) -o $(EXEC) $(LFLAGS)clean: rm -rf $(EXEC) $(OBJS)
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!