【第5章3】GNU Make

合集下载

GNUmake项目管理工具的使用

GNUmake项目管理工具的使用

GNUmake项目管理工具的使用课程名称:软件工程实验项目名称:实验二GNU make项目管理工具的使用一、实验目的:1.熟悉GNU make的操作知识;2.掌握如何创建makefile。

二、实验环境:硬件:PC机,core Ⅱ双核CPU,2G以上内存;软件:windows三、实验内容及结果:1、编写简单的makefile1)根据《GNU Make项目管理(第三版)》第11页至第12页说明编写一个简单的makefile。

makefile及执行make命令的结果如下:makefile:gcc hello.c –o hello$ makegcc hello.c -o hello2)根据《GNU Make项目管理(第三版)》第12页至第14页说明编写一个makefile,学习了解makefile文件中一项规则的三个部分:工作目标、它的必要条件、所要执行的命令。

makefile及执行make命令的结果如下$ makegcc -c count_words.cflex -t lexer.l > lexer.cgcc -c lexer.cgcc count_words.o lexer.o -lfl -o count_words2、规则的学习1)根据《GNU Make项目管理(第三版)》第25页至第27页说明编写一个makefile,学习了解makefile文件中的变量。

makefile及执行make命令的结果如下:$ makegcc -c counter.cgcc count_words.o counter.o lexer.o /lib/libfl.a -o count_words2)根据《GNU Make项目管理(第三版)》第27页至第31页说明编写一个makefile,学习了解makefile文件中以VPATH和vpath 查找文件、模式规则。

应用模式规则的makefile及执行make命令的结果如下$ makegcc -I include -c count_words.c -o count_words.ogcc -I include -c counter.c -o counter.ogcc -I include -c lexer.c -o lexer.ogcc -I include count_words.o counter.o lexer.o /lib/libfl.a -o count_words。

gnu 命令行规则

gnu 命令行规则

GNU命令行规则:
1.简洁性:GNU命令行通常尽可能地保持简洁,避免不必要的复杂
性。

每个命令都被设计为完成一个特定的任务,并且尽可能地减少输入的字符数。

2.参数:大多数GNU命令接受参数,这些参数用于指定命令的行为
或提供所需的信息。

参数通常以短横线开头,后面跟着参数的名称或标志。

例如,ls命令可以接受-l参数来以长格式显示文件列表。

3.选项:GNU命令还接受选项,这些选项用于更改命令的行为或提
供额外的功能。

选项通常以连字符开头,后面跟着选项的名称或标志。

例如,gcc命令可以接受-O2选项来启用优化级别2。

4.输出:GNU命令通常将输出重定向到标准输出设备(stdout),
除非指定了其他输出设备。

输出可以包含命令的执行结果、错误消息或状态信息等。

5.错误处理:GNU命令通常具有错误处理机制,当命令执行失败时
可以提供有用的错误消息。

这些消息可以帮助用户了解问题的原因并提供解决方案。

6.帮助:GNU命令通常提供帮助文档,通过man命令或--help选项
可以查看详细的使用说明和选项列表。

Gnu Make指南

Gnu Make指南

| 返回主页 | 本站地图 | 站内搜索 | 联系信箱 |您目前的位置:首页 > 自由软件 > 技术交流 > 应用编程GNU make 指南蓝森林 2000年8月10日 10:56作 者: 哈少译者按: 本文是一篇介绍 GNU Make 的文章,读完后读者应该基本掌握了make 的用法。

而 make 是所有想在 Unix (当然也包括 Linux )系统上编程的用户必须掌握的工具。

如果你写的程序中没有用到 make ,则说明你写的程序只是个人的练习程序,不具有任何实用的价值。

也许这么说有点 儿偏激,但make 实在是应该用在任何稍具规模的程序中的。

希望本文可以为中国的 Unix编程初学者提供一点儿有用的资料。

中国的 Linux 用户除了学会安装红帽子以外, 实在应该尝试写一些有用的程序。

个人想法,大家参考。

C-Scene 题目 #2多文件项目和 GNU Make 工具作者: 乔治富特 (Goerge Foot)电子邮件: george.foot@Occupation: Student at Merton College, Oxford University, England职业:学生,默尔顿学院,牛津城大学,英格兰IRC匿名: gfoot拒绝承诺:作者对于任何因此而对任何事物造成的所有损害(你所拥有或不拥有的实际的,抽象的,或者虚拟的)。

所有的损坏都是你自己的责任,而与我无关。

所有权: “多文件项目”部分属于作者的财产,版权归乔治富特1997年五月至七月。

其它部分属 CScene 财产,版权 CScene 1997年,保留所有版权。

本 CScene 文章的分发,部分或全部,应依照所有其它 CScene 的文章的条件来处理。

0) 介绍~~~~~~~~~~~~~~~本文将首先介绍为什么要将你的C源代码分离成几个合理的独立档案,什么时候需要分,怎么才能分的好。

然后将会告诉你 GNU Make 怎样使你的编译和连接步骤自动化。

GNUmake中文手册

GNUmake中文手册
make通过比较对应文件(规则的目标和依赖,)的最后修改时间,来决定哪些文件需要更新、那些文件不需要更新。对需要更新的文件make就执行数据库中所记录的相应命令(在make读取Makefile以后会建立一个编译过程的描述数据库。此数据库中记录了所有各个文件之间的相互关系,以及它们的关系描述)来重建它,对于不需要重建的文件make什么也不做。
make是一个命令工具,它解释Makefile中的指令(应该说是规则)。在Makefile文件中描述了整个工程所有文件的编译顺序、编译规则。Makefile有自己的书写格式、关键字、函数。像C语言有自己的格式、关键字和函数一样。而且在Makefile中可以使用系统shell所提供的任何命令来完成想要的工作。Makefile(在其它的系统上可能是另外的文件名)在绝大多数的IDE开发环境中都在使用,已经成为一种工程的编译方法。
所要完成的Makefile文件描述了整个工程的编译、连接等规则。其中包括:工程中的哪些源文件需要编译以及如何编译、需要创建那些库文件以及如何创建这些库文件、如何最后产生我们想要得可执行文件。尽管看起来可能是很复杂的事情,但是为工程编写Makefile的好处是能够使用一行命令来完成“自动化编译”,一旦提供一个(通常对于一个工程来说会是多个)正确的Makefile。编译整个工程你所要做的唯一的一件事就是在shell提示符下输入make命令。整个工程完全自动编译,极大提高了效率。
目前,系统完整的介绍make工具和如何编写Makefile的中文文档比较少。我整理这个文档就是希望能使众多的Linux环境下的程序员能够比较容易的掌握和学会使用GNU make。本文所要介绍的是GNU的make,采用Red Hat FC3(包括最新发布的GNU Linux系统)所集成的GUN make工具。

GNU-Make-使用手册(中译版)

GNU-Make-使用手册(中译版)

GNU Make 使用手册(中译版)翻译:于凤昌译者注:本人在阅读Linux源代码过程中发现如果要全面了解Linux的结构、理解Linux的编程总体设计及思想必须首先全部读通Linux源代码中各级的Makefile文件.目前,在网上虽然有一些著作,但都不能全面的解释Linux源代码中各级的Makefile文件,因此本人认真阅读了GNU Make 使用手册(3。

79)版原文,在此基础上翻译了该手册,以满足对Linux源代码有兴趣或者希望采用GCC编写程序但对缺乏GNU Make全面了解之人士的需要。

本人是业余爱好不是专业翻译人士,如果有问题请通过电子信箱与我联系共同商讨,本人的E—mail为:yfc70@public2。

注意在文章中出现的斜体加粗字表示章节。

GNU make Version 3。

79April 2000Richard M。

Stallman and Roland McGrath目录1 make概述1.1 怎样阅读本手册1.2 问题和BUG2 Makefile文件介绍2。

1 规则的格式2。

2一个简单的Makefile文件2.3make处理Makefile文件的过程2。

4使用变量简化Makefile文件2。

5让make推断命令2。

6另一种风格的Makefile文件2。

7在目录中删除文件的规则33编写Makefile文件3.1Makefile文件的内容3.2Makefile文件的命名3。

3包含其它的Makefile文件3。

4变量MAKEFILES3.5Makefile文件重新生成的过程3.6重载其它Makefile文件3。

7make读取Makefile文件的过程4 编写规则4。

1规则的语法4。

2在文件名中使用通配符4。

2.1通配符例子4。

2。

2使用通配符的常见错误4.2.3函数wildcard4.3在目录中搜寻依赖4。

3.1VPATH:所有依赖的搜寻路径4.3.2vpath指令4。

3。

3目录搜寻过程4。

GNU Make简介

GNU Make简介

关于Makefile-隐藏规则
OBJS = main.o common.o CC = gcc CFLAGS = -Wall HelloWorld: $(OBJS) $(CC) $(CFLAGS) -o HelloWorld $(OBJS) 增加依赖关系: OBJS = main.o common.o CC = gcc CFLAGS = -Wall HelloWorld: $(OBJS) $(CC) $(CFLAGS) -o HelloWorld $(OBJS) depends : main.c common.c gcc -M main.c common.c > depends -include depends
关于Makefile-函数
OBJS = $(patsubst %.c,%.o,$(wildcard *.c)) CC = gcc CFLAGS = -Wall HelloWorld: $(OBJS) $(CC) $(CFLAGS) -o HelloWorld $(OBJS) .PHONY : clean clean : -rm *.o *.exe
目标 : 依赖文件 [TAB]命令
关于Makefile-示例
HelloWorld: main.o common.o gcc -Wall -o HelloWorld main.o common.o main.o:main.c gcc -c -Wall -o main.o main.c common.o:common.c common.h gcc -c -Wall -o common.o common.c
GNU Make简介
培训目的
通过本课程学习,达到了解GNU Make工作原理,能 独立编写简单Makefile进行程序编译的目的。

GNU Make开发快速入门(三)——Make进阶篇

GNU Make开发快速入门(三)——Make进阶篇
的 , 样 可 以加 快 和 优化 外 层 应用 开 发 , 而 达 这 从
可 以 使 用 “p — q lr p 命 令 查 从 图 1 以 看 到 , 别 对 应 的 是 a t c n 可 分 uo o f 2
5 — 5、 a omak 9.- 9 ut e 1. 2 3和 l t ol 5.- i o b 1. 6 4。
au o On t C f和 I t Ol 属 于 一 个 工 具 集 G NU i o 都 b Au o o l 主 要 包 含 a t c n 、 a t m a e和 t t o s, uo o f uo k
师 维 护 Ma e l 负 担 ,因 此 产 生 了 a tma e k fe的 i uo k 应 用 工 具 。程 序 员 只 需 写 一 些 预 先 定 义 好 的 宏 , 交 给 aut I 处 理 后 自 动 生 成 一 个 可 供 OI ke Ta
工 具分 别 开 发 , 协 同工 作 得 很好 。 连 开 发者 但 就
自 己 也 承 认 , 套 工 具 虽 然 好 用 ,但 是 学 习 曲 线 这
很 曲 折 。a u o o f a t ma e I t o 三 个 工 a tc n 、 uo k 和 l o l i b
具 往 往 被 认 为 是 一 个 工 具 集 。GN ttos U Auoo l有 新 旧 两 个 版 本 , 文 采 用 的 RHEL4 O 新 版 本 , 本 .是
件 就 不 大 可 能 被 开 发 。 件 的 限 制 会 改 变 平 台 的 然 GNU Ma e l n e t n ( 硬 k fe Co v ni sGNU Ma e l i o k fe i
选 择 , 因 为 系 统 平 台 不 同 而 产 生 的 用 户 将 会 出 惯 例 ) 定 了 一 些 使 用 GNU 程 序 设 计 时 撰 写 制 现 , 户 也许 会 由于新 版 的 操作 系统 而对 软 件做 Ma e l 一 些标 准 和 规 范 , 是 内容 很 长 、 用 k fe的 i 但 很 不 兼 容 的 修 改 。另 外 , 些 使 得 编 译 软 件 更 容 易 复 杂 , 且 要 经 常 做 些 调 整 , 了 减 轻 程 序 设 计 那 并 为 和 更 少 错 误 的 工 具 也 是 很 有 价 值 的 。 uo k 、 a tma e

GNU Make开发快速入门(一)——Make基础知识

GNU Make开发快速入门(一)——Make基础知识

c o ( 时 )作 业 调 用 Ma e rn 定 k 非
常容易 。 实 际 上 , k 工 具 的 应 用 不 Ma e
具 , C是 Ln x程 序 开 发 的基 GC iu
础 , 而 M a e是 L n x编 程 工 具 k iu
仅 是编程 , 可 以用于 任何 一 些 还 文件 需要 自动 更 新另 一些 文件 的 任务 。Ma e工具 基 本概 念 类 似 k 于 P oo 语 言 , 告诉 需 要做 什 r lg 只
么 。提 供 一 些 规 则 ,其 他 工 作 由 Ma e 完 成 。 k 来 ’
些 部分 的 封 装性 ,以及它 们 内部 箱 中 另 外 一 个 关 键 的 工 具 。
Ma e可 以 自动 管 理 软件 编 译 的 k 内容 、方 式和 时机 。在 大 型 的开 发 项 目中 ,通 常有 几 十 到上 百 个 的源 文 件 ,如 果每 次均 手 工键 入 GCC命 令进 行 编译 , 会 非常 不 则
Ma e 述 k概
GCC和 M a e 是 建 立 在 内 k都 核 基 础 上 的 开 发 工 具 和 辅 助 工
外 , a e 以 让 编 译 过 程 自动 M k 可
化 。 因 此 , 使 用 She l 本 或 l脚
对 它 的 处理 将 会 变得 非常 复 杂 ,
而 且需 要花 费 的时 间也 会越 来 越 多 。这 时往 往 把程 序 划分 成 多 个 相对 独 立 的 部分 。怎 样 处理 好 这 完 整 性 和 之 间 的 依 赖 及 协 调 关 系 ,成 了现 在 软件 工程 中非 常 重 要 的工 作 。当开 发的程 序 非 常 庞 大 时 ,它 可 能 包含 数 以百计 的 组

使用GNUmake编辑makefile(精)

使用GNUmake编辑makefile(精)

现在来看一下make做的工作:首先 make按顺序读取makefile中的规则,然后 检查该规则中的依赖文件与目标文件的时 间戳哪个更新,如果目标文件的时问戳比 依赖文件还早,就按规则中定义的命令更 新目标文件。如果该规则中的依赖文件又 是其他规则中的目标文件,那么依照规则 链不断执行这个过程,直到Makefile文件 的结束,至少可以找到一个不是规则生成 的最终依赖文件,获得此文件的时间戳, 然后从下到上依照规则链执行目标文件的 时间戳比此文件时间戳旧的规则,直到最 顶层的规则。

依靠这些信息,make会对磁盘上的文件进 行检查,如果目标文件的生成或被改动时 的时间(称为该文件时间戳)至少比它的 一个依赖文件还旧的话,make就执行相应 的命令,以更新目标文件。目标文件不一 定是最后的可执行文件,可以是任何一个 中间文件并可以作为其他目标文件的依赖 文件。



一个Makefile文件主要含有一系列的规则,每条 规则包含以下内容。 目标文件列表 :依赖文件列表
2. makefile文件的基本结构
GNU make的主要功能是读进一个文本 文件makefile并根据makefile的内容执行一 系列的工作。makefile的默认文件名为 GNUmakefile、makefile或Makefile,当 然也可以在make的命令行中指定别的文件 名。如果不特别指定,make命令在执行时 将按顺序查找默认的makefile文件。多数 Linux程序员使用第三种文件名Makefile。 因为第一个字母是大写,通常被列在一个目 录的文件列表的最前面。
但是,在检查文件prog.o和code.o的时 间戳之前,make会在下面的行中寻找以 prog.o和code.o为目标的规则,在第三行 中找到了关于prog.o的规则,该文件的依赖 文件是prog.c、prog.h和code.h。同样, make会在后面的规则行中继续查找这些依 赖文件的规则,如果找不到,则开始检查这 些依赖文件的时间戳,如果这些文件中任何 一个的时间戳比prog.o的新,make将执行 “gcc –c prog.c –o prog.o”命令,更新 prog.o文件。

GNU make工具

GNU make工具

4、用make工具对Makefile文件进行编译
对上述第3步骤创建和编写的Makefile文件用make进行编译,具体编译操作如下
[root@localhost liudeguo]# make
输入上述make命令后,如果liudeguo文件夹下件是最新的,即将用make工具编译后的main文件覆盖之前的main文件
[root@localhost liudeguo]# vi Makefile
输入上述命令后此时Makefile文件就被打开了,且其中没有任何内容,如果需要对本文本进行编辑则按i或a进入插入模式进行编辑,如果需要保存此文本则按ESC键进入末行命令模式,输入:wq命令来保存退出,下面用ls命令来查看liudeugo目录下是否有Makefile文件,如果有则说明创建成功
main:main.c语句中的main名称是指我们编译输出的可执行文件名称,此main可执行文件的生成依赖于main.c文件,这两个文件之间用:来隔开
gcc -o main main.c语句中的gcc是指用gcc编译器对main.c文件进行编译,在编译时指定输出可执行文件的名称,用选项-o来实现,-o后面紧跟要输出可执行文件的名称main,输出文件的名称后面紧跟要被编译的文件名称(带扩展名.c)main.c
}
输入完上述五行语句后,按ESC键进入vi编辑器的末行命令模式,按:wq保存退出
3、Makefile文件的创建和编写
A、Makefile简介
在执行make之前,需要一个命名为Makefile的特殊文件(本文的后续将使用Makefile作为这个特殊文件的文件名)来告诉make需要做什么(完成什么任务),该怎么做,通常,make工具主要被用来进行工程编译和程序链接,下面我们来编写一个Makefile文件,让它自动来编译我们已经写好的main.c文件

GNU Make 说明书

GNU Make 说明书

GNU Make 使用手冊Version 3.79繁體版更新日期 2006/08/30 校稿 ChanningLan目錄1 make概述1.1 怎樣閱讀本手冊1.2 問題和BUG2 Makefile檔案介紹2.1 規則的格式2.2一個簡單的Makefile檔案2.3mke處理Makefile檔案的過程2.4使用變數簡化Makefile檔案2.5讓make推斷命令2.6另一種風格的Makefile檔案2.7在目錄中刪除檔案的規則3编寫Makefile文件3.1Makefile檔案的內容3.2Makefile檔案的命名3.3引入(include)其它的Makefile檔案3.4變數MAKEFILES3.5Makefile檔案重新生成的過程3.6重載其它Makefile檔案3.7make讀取Makefile檔案的過程4 編寫規則4.1規則的語法4.2在檔案名中使用萬用字元4.2.1萬用字元例子4.2.2使用萬用字元的常見錯誤4.2.3函數wildcard4.3在目錄中搜尋先決條件4.3.1VPATH:所有先決條件的搜尋路俓(stem)4.3.2vpath指令4.3.3目錄搜尋過程4.3.4編寫搜尋目錄的shell命令4.3.5目錄搜尋和隱含規則4.3.6連接庫(Link Libraries)的搜尋目錄4.4假想(phony)目標4.5沒有命令或先決條件的規則4.6使用空目錄檔案記錄事件4.7內建的特殊目標名4.8具有多個目標的規則4.9具有多條規則的目標4.10靜態樣式規則4.10.1靜態樣式規則的語法4.10.2靜態樣式規則和隱含規則4.11雙冒號規則(::)4.12自動生成先決條件5 在規則中使用命令5.1命令回顯5.2執行命令5.3並行執行5.4命令錯誤5.5中斷或關閉make5.6遞迴make5.6.1變數MAKE的工作模式5.6.2與子make通訊的變數5.6.3與子make通訊的選項5.6.4`--print-directory'選項5.7定義固定次序命令5.8使用空命令6使用變數6.1變數引用基礎6.2變數的兩個特色6.3變數進階引用技術6.3.1替換引用6.3.2巢狀變數引用6.4變數取值6.5設定變數6.6為變數值附加文字(text)6.7撤銷(override)指令6.8定義多行變數6.9環境變數6.10特定目標變數的值6.11特定樣式變數的值7 Makefile檔案的條件語句7.1條件語句的例子7.2條件語句的語法7.3測試標誌的條件語句8 文字(text)轉換函數8.1函數呼叫語法8.2字元串替換和分析函數8.3檔案名函數8.4函數foreach8.5函數if8.6函數call8.7函數origin8.8函數shell8.9控制Make的函數9執行make9.1指定Makefile檔案的參數9.2指定最終目標的參數9.3代替執行命令9.4避免重新編譯檔案9.5變數重載9.6測試編譯程式9.7選項概要10 使用隱含規則10.1使用隱含規則10.2隱含規則目錄10.3隱含規則使用的變數10.4隱含規則鏈10.5定義與重新定義樣式規則10.5.1樣式規則簡介10.5.2樣式規則的例子10.5.3自動變數10.5.4樣式匹配10.5.5萬用規則10.5.6刪除隱含規則10.6定義最新類型的預設規則10.7舊式的後置規則(suffix rule)10.8隱含規則搜尋算法11 使用make更新資料庫檔案11.1資料庫成員目標11.2資料庫成員目標的隱含規則11.2.1更新資料庫成員的符號索引表11.3使用檔案的危險11.4資料庫檔案的後置規則(suffix rule)12 GNU make的特點13 不相容性和失去的特點14 Makefile檔案慣例14.1makefile檔案的通用慣例14.2makefile檔案的工具14.3指定命令的變數14.4安裝路俓(stem)變數14.5用戶標準目標14.6安裝命令分類15快速參考16make產生的錯誤17複雜的Makefile檔案例子附錄 名詞翻譯對照表1 Make 概述Make 可自動決定一個大程式中哪些檔案需要重新編譯,並發布重新編譯它們的命令。

Linux编程基础(GNU make)

Linux编程基础(GNU make)

makeGNU的make能够使整个软件工程的编译、链接只需要一个命令就可以完成。

Makefile:make在执行时,需要一个命名为Makefile的文件。

Makefile文件描述了整个工程的编译,连接等规则。

其中包括:工程中的哪些源文件需要编译以及如何编译;需要创建那些库文件以及如何创建这些库文件、如何最后产生我们想要得可执行文件。

1Makefile术语规则:用于说明如何生成一个或多个目标文件,规则格式如下:targets:prerequisitescommand目标依赖命令main.o:main.cgcc–c main.c**命令需要以【TAB】键开始**2Makefile目标在Makefile中,规则的顺序是很重要的,因为,Makefile中只应该有一个最终目标,其它的目标都是被这个目标所连带出来的,所以一定要让make知道你的最终目标是什么。

一般来说,定义在Makefile中的目标可能会有很多,但是第一条规则中的目标将被确立为最终的目标。

3Makefile文件名make命令默认在当前目录下寻找名字为makefile或Makefile的工程文件,当名字不为这两者之一时,可以使用如下方法指定:make–f文件名。

4伪目标Makefile中把那些没有任何依赖只有执行动作的目标称为“伪目标”(phony targets)。

.PHONY:cleanclean:rm–f hello main.o func1.o func2.o“.PHONY”将“clean”目标声明为伪目标5变量hello:main.o func1.o func2.ogcc main.o func1.o func2.o-o hello思考1:如果要为hello目标添加一个依赖,如:func3.o,该如何修改?答案1:hello:main.o func1.o func2.o func3.ogcc main.o func1.o func2.o func3.o-o hello 答案2:obj=main.o func1.o func2.o func3.ohello:$(obj)gcc$(obj)-o hello6系统默认变量在makefile中,存在系统默认的自动化变量$^:代表所有的依赖文件$@:代表目标$<:代表第一个依赖文件例:hello:main.o func1.o func2.ogcc main.o func1.o func2.o-o hello=》hello:main.o func1.o func2.ogcc$^-o$@7杂项1、Makefile中“#”字符后的内容被视作注释。

GNULinux编程课件 (5)

GNULinux编程课件 (5)

Makefile文件中的潜规则
3. 模式规则 模式规则是对具体规则的进一步抽象,定义了一类具有
相同行为特点的规则。
例如, %.o: %.c
$(CC) -c $< -o $@
创建和使用函数库
静态函数库与共享函数库
应用程序
应用程序
嵌入 目标对象
文件的组织结构不同
调用 目标文件
静态库
共享库
一个静态库由若干个.o目标文件构成 一个目标文件由若干个目标对组成 目标对象可以是函数或全局变量。 库文件命名:libxxx.a
gcc -c mod.c lib.o:lib.c lib.h
gcc -c lib.c clean:
rm -f *.o
Makefile中的变量
1. 自定义变量 语法 变量名= 字符串 功能 将'字符串'赋给'变量名',在makefile中变量无数据类型。 引用: $(变量名)
2. 环境变量 Make在运行过程中,将环境变量转化为同名同值的make变量,用 户也可在Makefile中对这些变量进行重新定义。
选项 Wall g O o0 o1 o2 i L D l static shared E S c o Wl
fPIC
gcc 命令选项
功能描述 打印警告信息 添加调试信息到输出文件 优化选项,若有多个,则最后一个有效 指定头文件搜索路径,若有多个则从前往后搜索 指定库搜索路径,若有多个,则从前往后搜索 给所编译文件定义一个宏,其值为1 指定引用的库,从当前位置向后搜索 使用静态链接 使用动态链接 输出预处理后的文件 编译生成的汇编文件(.s) 编译生成的目标文件(.o) 指定输出文件名 告诉gcc/g++传送参数至linker

make工作时的执行步骤

make工作时的执行步骤

make⼯作时的执⾏步骤
GNU的make⼯作时的执⾏步骤
(1)读⼊所有的Makefile
(2)读⼊被include的其它Makefile
(3)初始化⽂件中的变量
(4)推导隐晦规则,并分析所有的规则
(5)为所有的⽬标⽂件创建依赖关系链
(6)根据依赖关系,决定哪些⽬标重新⽣成
(7)执⾏⽣存命令
定义在Makefile中的⽬标可能会有很多,但是第⼀条规则中的⽬标将被确⽴为最终的⽬标。

如果第⼀条规则中的⽬标有很多个,那么,第⼀个⽬标会成为最终的⽬标。

为了避免和⽂件重名的情况,可以使⽤⼀个特殊的标记".PHONY"来显⽰地指明⼀个⽬标是“伪⽬标”,向make说明,不管是否有这个⽂件,这个⽬标就是“伪⽬标”。

如果make执⾏时,带⼊make参数“-n” 或“--just-print”。

那么其只是显⽰命令,但不会执⾏命令,这个功能有利于调试Makefile。

⽽make参数“-s”或者“--slient”则是全⾯禁⽌命令的显⽰。

GNU工具链的构成和使用

GNU工具链的构成和使用

GNU工具链的构成和使用随着开源软件的普及,GNU编译工具、Linux操作系统和各种各样的开源应用软件越来越多的融入到应用和嵌入式系统的开发中。

GNU编译工具链有哪些部件构成?各个部件的功能怎么样?如何使用?就这些问题嵌入式linux中文站在这里做一个初步整理。

GNU编译工具链是一个“免费”的C/C++工具链,有力的支撑了Linux系统的发展。

众多的处理器厂家都提供了对GNU编译工具链的支持(本地编译工具链(native-compile toolchain)、交叉编译(cross-compile toolchain)),这也使得其成为了嵌入式软件开发中最流行的工具集。

其支持的体系结构非常广泛,其中包括:X86, IA-32, MIPS, tile, PowerPC, Spark etc.通常来讲,我们认为GNU工具链主要由以下几个大的单元构成:1. GNU C Library,也就是通常所说的glibc,另外在嵌入式领域,往往采用glibc兼容的uclibc、newlib等。

glibc是由GNU项目提供的标准C运行库,它针对PC应用设计,较庞大,但能提供最优的兼容性。

如果一般的嵌入式开发可选用uClibc。

uClibc原本是uCLinux开发过程中的一个C语言库,现已经独立于uCLinux项目并且进一步完善。

它对glibc的大部分函数进行了重写,并且目标就定位于嵌入式,所以其相对glibc而言要小巧很多。

此外由于它的函数与glibc保持一致,这样很多原本基于glibc开发的软件基本无需改动便可改用uClibc 编译运行,使得在嵌入式系统上占用的内存和磁盘空间更少。

但由于毕竟不是标准的C运行库,因此uClibc拥有着一定的兼容性问题。

Newlib是一个面向嵌入式系统的C运行库.最初是由Solutions收集组装的一个源代码集合,取名为newlib, 现在由Red Hat维护,对于与GNU 兼容的嵌入式C运行库,Newlib并不是唯一的选择,但是从成熟度来讲,newlib是最优秀的.newlib具有独特的体系结构,使得它能够非常好地满足深度嵌入式系统的要求.newlib可移植性强, 具有可重入特性,功能完备等特点,已广泛应用于各种嵌入式系统中.2. 编译工具GNU Compiler Collection (GCC),3. 二进制实用程序Binutils (GNU binary utilities),其中包括:objdump、readelf、strip、ar、nm、ldd、ngprof、gcov等。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

makefile

makefile文件控制make程序的执行 一个项目拥有一个或多个makefile文件 每个makefile文件由多条rules构成 每条rule描述了一个依赖关系,并有一系列的行为
makefile rules
rule的格式为: target … : prerequisites … command … … target 依赖prerequisites的目标 prerequisites 被依赖的源程序,例如c文件或h文件 command需要执行的命令 当prerequisites任何一个文件的时戳新于target的时戳 时,就执行command。
ar rv libutil.a input.o process.o output.o r选项:以替换的方式将文件插入到archive文件中; v选项:verbose模式,大量输出信息。
程序库的使用

直接使用库的全名 gcc analyzer.c libutil.a -o analyzer 使用库的主干名 gcc analyzer.c -L. -lutil -o analyzer

makefile rules

rules的分类

explicit rules pattern rules implicit rules
explicit rules

在rules中指明targets和prerequisites的文件名
main.o: main.c defs.h gcc -c main.c
Pattern Rules


Why pattern rules? explicit rules含有大量冗余。在软件设计中冗 余就代表维护困难。 软件设计要遵守DRY(Don’t Repeat Yourself) 原则。
Pattern Rules



很多软件的工作过程都遵守一个固定的 pattern(模式):读入某种格式的文件,输出另 一种格式的文件; C语言编译器是读入后缀名为”.c”的C代码文件 ,产生后缀名为”.o”的中间文件; 链接器是读入后缀名为”.o”的中间文件,产生 可执行文件。

优点:清晰直观 确定:繁琐
makefile using explicit rules
makefile using explicit rules


Phony Target clean是一个伪目标(Phony Target)。 clean 没有任何prerequisites,只有显式的make clean才能执行clean目标的command。 对于伪目标,最好使用.PHONY声明

避免代码重复
Automatic Variables
main.o: main.c defs.h $(CC) -c $(CFLAGS) main.c command.o: command.c command.h defs.h $(CC) -c $(CFLAGS) command.c $< (prerequisits列表中 第一个文件名) main.o: main.c defs.h $(CC) -c $(CFLAGS) $< command.o: command.c command.h defs.h $(CC) -c $(CFLAGS) $<


根据依赖关系自动决定项目的那些部分需 要重新编译。 基本原理:如果某个源程序文件被修改, 那么依赖这个源程序文件的所有目标文件, 都需要重新编译。
依赖关系示例

edit软件构成
描述 主程序 键盘控制 命令 显示 文本插入 文本搜索 依赖c文件 main.c kbd.c command.c display.c insert.c search.c 依赖h文件 defs.h defs.h command.h defs.h command.h defs.h buffer.h defs.h buffer.h defs.h buffer.h
automatic variables
符号 $@ $< $? 意义
$^ $*
target代表的文件名 prerequisites中第一个文件名 prerequisites中所有比target时戳更新的文件名,用空 格隔开 prerequisites中所有文件名,用空格隔开 target文件名的主干部分,即不包含后缀的部分
构建过程

如果项目已经成功构建,之后command.h文件 被修改。则执行make的构建顺序为
gcc -c kbd.c defs.h command.h gcc -c command.c defs.h command.h gcc -c file.c defs.h command.h buffer.h gcc main.o kbd.o command.o display.o \ insert.o search.o file.o utils.o -oedit
utils
main.c
kbd.c
command.c
display.c
insert.c
search.c
files.c
utils.c
defs.h
command.h
buffer.h
构建过程

如果项目没有进行过任何构建,则执行make 后的构建顺序为
gcc -c main.c defs.h gcc -c kbd.c defs.h command.h gcc -c command.c defs.h command.h gcc -c display.c defs.h buffer.h gcc -c insert.c defs.h buffer.h gcc -c search.c defs.h buffer.h gcc -c file.c defs.h command.h buffer.h gcc -c utils.c defs.h gcc main.o kbd.o command.o display.o insert.o \ search.o file.o utils.o -oedit
variables

variables定义和使用
CC = ccsimpc CFLAGS = -g main.o: main.c defs.h $(CC) -c $(CFLAGS) main.c
variables
More Abstract
Automatic Variables


make通过自动变量自动提取targets和 prerequisites的文件名; 优点


使用库文件的makefile
analyzer: libutil.a analyzer.o libutil.a: input.o process.o output.o $(AR) $(ARFLAGS) $@ $^ analyzer.o: input.o: input.h process.o: process.h output.o: output.h .PHONY: clean clean: rm -f *.o *.a analyzer

两者十分类似; Pattern Rules使用”%”替代文件名的主干
%.o: %.c $(COMPILE.c) $(OUTPUT_OPTION) $< main.o: main.c $(COMPILE.c) $(OUTPUT_OPTION) $<
程序库的使用

在Linux中库文件又称为archive文件; archive是一种包含其他文件的特殊文件。 可以将多个中间文件打包成库文件。
GNU make
邹昕光 哈尔滨工业大学自动化测试与控制研究所 2011
make基本概念

什么是make?

The make utility automatically determines which pieces of a large program need to be recompiled, and issues commands to recompile them.
《A Program for Directing Recompilation GNU》


为什么需要make?

避免手工构建项目出错; 自动化构建,减轻大项目构建时的工作量。
如何使用make


建立一个makefile文件,描述源代码文件之间 的依赖关系; 执行make,构建项目。
make工作原理
模块 main kbd command display insert search
file
utils
文件管理
其他杂项
file.c
utils.c
defs.h command.h buffer.h
defs.h
依赖关系示例
edit
main
kbd
command
dispaly
insert
search
file
.PHONY: clean clean: rm edit *.o
A Simple Makefile
构建edit项目 $ make 删除edit项目中的目标文件 $ make clean

variables


Why variables? 假设我们的软件需要跨平台,要运行在Linux ,Windows和VxWorks上。 不同的平台使用的编译器不一样,我们需要维 护三个版本的makefile。
PattБайду номын сангаасrn Rules

make内置的pattern rules库 针对c语言编译的rule
%.o: %.c $(COMPILE.c) $(OUTPUT_OPTION) $<
相关文档
最新文档