017Makefile工程管理
1、为什么需要Makefile?
利用Makefile和make的合作,可以把很多很多的工作合并成一个非常简单的命令:make;
make能够使整个程序的编译、链接只需要一个命令(make)就可以完成;
make的工作主要依赖于一个叫做Makefile的文件。Makefile文件描述了整个程序的编译、链接等规则。其中包括工程中哪些源文件需要编译以及如何编译,如何最后产生我们想要的可执行文件。
2、Makefile构成规则
规则用于说明如何生成目标文件,格式如下:
target : prerequisites
command
目标 : 依赖
命令
特别注意:命令需要使用【TAB】键空格
范例:
led.elf:led.o
arm-linux-ld -Tled.lds -o led.elf led.o
Makefile中把那些只包含命令,没有任何依赖的目标称为伪目标(phony targets)
.PHONT:clean
clean:
rm -f hello main.o func.o
".PHONY"将"clean"目标声明为伪目标
3、Makefile构成—最终目标
(1)当一个Makefile中有多条规则时,如何单独执行某条规则?
make(空格)目标的名字
(2)如果用户没有指定执行某一条规则,make会默认执行Makefile中的第一条规则,而这条规则中的目标称之为:最终目标;
4、Makefile规则—变量
使用变量前:
app1 : app1.o func1.o func2.o
gcc app1.o func1.o func2.o -o app1
app2 : app2.o func1.o func2.o
gcc app2.o func1.o func2.o -o app2
使用变量后:
obj=func1.o func2.o
app1 : app1.o $(obj)
gcc app1.o $(obj) -o app1
app2 : app2.o $(obj)
gcc app2.o $(obj) -o app2
在一个Makefile中,多次出现的组成部分,可以使用变量进行替换;
Makefile中,变量没有类型,不需要去定义它,直接赋值就可以了;
变量的名字是可以随便取的;
obj是变量名,紧接着是赋值号=,左右两边不要有空格,在Makefile中不允许有这样的空格;
给变量赋值时,直接变量名,赋值号就可以了;
但是当我们引用这个变量时,要用$(变量名)
在Makefile中,用户除了可以自己定义变量外,还可以使用存在系统已经定义好的默认变量。
$^:代表所有的依赖文件
$@:代表目标
$<:代表第一个依赖文件
使用前:
led.o : led.S
arm-linux-gcc -g -o led.o -c led.S
使用后:
led.o : led.S
arm-linux-gcc -g -o $@ -c $^
5、Makefile构成—通用规则
当一个Makefile中有许多类似的规则时,如何将这些规则合并为一条通用规则?
%.o : %.S
使用前:
led.o : led.S
arm-linux-gcc -g -o $@ -c $^
main.o : main.S
arm-linux-gcc -g -o $@ -c $^
func.o : func.S
arm-linux-gcc -g -o $@ -c $^
特点:命令一样,目标的名字与依赖的名字仅仅是后缀不一样
就可以写成:
%.o : %.S
arm-linux-gcc -g -o $@ -c $^
%表示任意的两个相同的名字名字
6、Makefile使用技巧—去回显
去回显:节省时间
回显:执行命令时,会打印出命令
比如执行make clean,会打印出:rm *.o *.bin *.elf
方法:在命令前加@符号!
func.o : func.S
@arm-linux-gcc -g -o $@ -c $^
7、Makefile使用技巧—文件名
make命令默认在当前目录下寻找名字为Makefile或makefile的工程文件,当名字不为这两者之一时,可以使用如下方法指定:
make -f 文件名
整体运行时,运行命令:make -f 文件名
单独执行某条指令时:例如执行make clean,应写为:make -f 文件名 clean
017Makefile工程管理的更多相关文章
- 使用BLADE构建c++工程管理
使用BLADE构建c++工程管理 字数764 阅读2753 评论2 喜欢4 一. c++工程依赖管理 之前在百度一直使用comake2构建c++项目,十分方便.免去了手写Makefile的痛苦,很多项 ...
- emacs工程管理,cedet ede插件自动构建Make,Automake
鉴于自己一直都是在做客户端开发方面的工作,服务端很多知识都随着时间淡忘了,最近有一个计划,用一些时间补一下基础.所以早上很早就起床,花了一点时间大致浏览了一下BSD socket的相关API,然后用G ...
- Makefile 工程管理
Makefile 工程管理 Makefile 规则 --变量 在Makefile中,用户除了可以自己定义变量外,还可以使用存在系统已经定义好的默认变量 $^:代表所有的依赖文件 $@:代表目标 $&l ...
- make工程管理器
1.概述 大型程序中,人们希望工具自动识别修改的文件,而且不需要输入冗长的命令,就可以进行编译链接等操作,于是make工程管理器应运而生. make可以自动识别文件时间戳,只处理修改的文件: make ...
- 学习总结:工程管理与makefile
工程管理与makefile 一.为什么需要makefile和make 一个工程中的源文件可能很多,按照类型.功能.模块分别放在若干个目录中,为了有效地管理软件工程,更高效地编译整个工程,需要用到mak ...
- Go语言 函数,工程管理
Go语言 函数,工程管理 1.无参无返回值函数的使用 package main import "fmt" func main() { // 无参无返回值函数的调用:函数名() fu ...
- go语言基础之工程管理和工作区介绍
1.工程管理 在实际的开发工作中,直接调用编译器进行编译和链接的场景是少而又少,因为在工程中不会简单到只有一个源代码文件,且源文件之间会有相互的依赖关系.如果这样一个文件一个文件逐步编译,那不亚于一场 ...
- RTT工程管理
一.RTT工程管理 RTT采用SCons管理工程. 本次安装版本:Python-2.7.3.1.exe,python-2.7.11.msi,scons-2.3.1-setup.exe 安装完成后,需要 ...
- Qt工程管理
Qt Creator工程管理Qt Creator以工程项目的方式对源码进行管理一个Qt Creator工程包含不同类型的文件 .pro项目描述文件.pro.user用户配置描述文件 //由Qt Cre ...
随机推荐
- MySQL处理数据库和表的常用命令
MySQL处理数据库和表的常用命令 [导读] 学习如何管理和导航MySQL数据库和表是要掌握的首要任务之一,下面的内容将主要对MySQL的数据库和表的一些常用命令进行总结,一些我们不得不掌握的命令,一 ...
- mac下Android开发环境搭建
之前一段时间在学习ios的开发,近一段时间想着也接触下Android开发,以来加深对移动端开发的理解.这里根据自己配置Android开发环境的过程,比较详细的来总结下自己的安装过程,希望对一些正准备配 ...
- Excel常用函数大全
1.ABS函数 函数名称:ABS 主要功能:求出相应数字的绝对值. 使用格式:ABS(number) 参数说明:number代表需要求绝对值的数值或引用的单元格. 应用举例:如果在B2单元格 ...
- 第十章 Vim程序编辑器学习(下)
在试用vim编辑时,vim会在于被编辑的档案的目录下,再建立一个名为****.swp的档案,如果你的系统因为某些原因断线,你编辑的档案还没有存储,这个时候的****.swp就能够挥发救援的功能 1.在 ...
- NYOJ-2 括号配对问题 -- 数据结构_堆栈
以前做过的,现在整理一下,主要是堆栈的使用 1.碰到左括号就入栈,碰到右括号就从栈里弹出一个和当前比配,匹配失败就肯定是NO了; 2.如果右括号弹栈的时候栈空,则说明之前没有和右括号匹配的左括号了,这 ...
- Find the Clones(字典树)
链接:http://poj.org/problem?id=2945 Description Doubleville, a small town in Texas, was attacked by th ...
- 合并 hdfs 文件
待研究,只做保存 将HDFS中不同目录下面的数据合在一起,并存放在指定的目录中,示例如: sqoop merge –new-data /test/p1/person –onto /test/p2 ...
- MapReduce从输入文件到Mapper处理之间的过程
1.MapReduce代码入口 FileInputFormat.setInputPaths(job, new Path(input)); //设置MapReduce输入格式 job.waitForCo ...
- Redis多机功能之Sentinel
Sentinel的目的:监视主从服务器,并在主服务器下线时自动进行故障转移 启动Sentinel 通过执行Redis安装文件中的redis-sentinel程序,可以启动一个Sentinel实例: r ...
- Android性能优化之:ViewStub
ViewStub是Android布局优化中一个很不错的标签/控件,直接继承自View.虽然Android开发人员基本上都听说过,但是真正用的可能不多. ViewStub可以理解成一个非常轻量级的Vie ...