关于如何编写Makefile

来源:互联网 发布:发布器永久域名 编辑:程序博客网 时间:2024/05/16 12:57

陈皓老师曾经在CSDN上写过关于Makefile很详细的文章,有兴趣的可以到这里慢慢研读。
http://blog.csdn.net/haoel/article/month/2004/02
这里我把他在文章里写的关于Makefile的一些较为基本且常用的操作总结在这里。

简介

在windows的开发环境下编译汇编链接生成目标文件,这一系列工作全都是IDE帮我们完成。但是在Linux的开发环境下,需要开发者自己来输入指令完成这些步骤。这个时候就出现了Makefile,Makefile在linux下的作用就是自动化编译,它完成的工作就和IDE一样,把工程中的各类源文件按照开发者在Makefile里定义的一系列规则来编译,比如文件的编译先后顺序,哪些文件需要重新编译等等。在Makefile定义好了以后,使用make指令就可以直接生成所有你要的目标文件了。

Makefile编写规则

基本格式为:

 target : prerequisites     command

target是目标文件,即你想要得到的文件。
prerequisite是你要生成target所需要的文件也叫依赖文件。
command是要获得上面目标文件所需要执行的指令。

我在这里写了一个简单的例子,包含了两个头文件和一个c文件。
Makefile示例1
接着我们使用vim创建一个Makefile文件,并往里面写入如下代码
Makefile示例2

退出vim使用指令make,再ls显示文件夹内容,发现多了test可执行文件和test.o目标文件。
Makefile3

清空目标文件的规则

为了便于代码的重编译和文件的清洁,我们会在Makefile中写入一个清空目标文件的语句。如图2中最后clean语句。在执行make语句后我们不想再要中间生成的.o文件,则执行指令make clean,Makefile则会执行clean下面的语句,删除掉.o文件。如图
Makefile5

make的工作原理

1.make在当前目录下找到Makefile文件;
2.找到后,按照文件中所写的第一个目标文件即最终目标;
3.如果目标文件不存在,或是目标文件所依赖的后面的 .o 文件的文件修改时间要比目标文件新,那么,他就会执行后面所定义的命令用来生成目标文件;
4.如果目标文件所依赖的.o文件也存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件。
5.当所有目标文件所需要的文件都创建完成后,就会创建最后的目标文件。

这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。但是像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,我们只能使用make clean去调用它。

Makefile中的伪目标

Makefile中有一个伪目标的概念,它的定义方式为
.PHONY:伪目标
伪目标可以是没有依赖文件的目标文件,例如clean就可以定义为伪目标,防止误触发。或者在一个Makefile里面你想一次make生成多个可执行文件,也可以利用伪目标的定义。例如

all : prog1 prog2 prog3   .PHONY : all   prog1 : prog1.o utils.o           cc -o prog1 prog1.o utils.o   prog2 : prog2.o           cc -o prog2 prog2.o   prog3 : prog3.o sort.o utils.o           cc -o prog3 prog3.o sort.o utils.o

all就为定义的伪目标,由于all是Makefile里的第一个出现的目标文件,所以它就是最终的目标文件,他又依赖于后面的的三个目标文件,make就会分别去生成这三个目标文件,从而达到一次make生成多个可执行文件的目的。

变量的声明

当我们一个工程是由多个.o文件组合而成的时候,这个时候为了方便修改和管理我们可以采用声明一个变量来代替这些.o文件。这样如果想要修改这些.o文件其中的哪一个的时候只要修改声明处的就可以了。
这里使用陈皓老师给出的例子

edit : main.o kbd.o command.o display.o \(\为续行符)       insert.o search.o files.o utils.o       gcc -o edit main.o kbd.o command.o display.o \       insert.o search.o files.o utils.o

这个edit目标文件由多个.o文件构成,如果想要修改其中一个时,加上后面的clean要修改三处,如果工程量再大一点则很容易出现遗漏。所以这里声明了变量objects,并且在后面的Makefile描述中就可以使用$(objects)代替这些变量。

objects = main.o kbd.o command.o display.o \          insert.o search.o files.o utils.oedit : $(objects)       gcc -o edit $(objects)
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 无线固话的号码怎么办 手机电话键没了怎么办 翼支付密码忘了怎么办 滴滴驾龄不够3年怎么办 百度云下的太慢怎么办 百度云下的好慢怎么办 网盘下载速度慢怎么办 4g移动卡网速慢怎么办 天翼校园开wifi怎么办 校园卡不给销户怎么办 吃腻了难受恶心怎么办 深夜吃撑了难受怎么办 吃撑了肚子难受怎么办 喝水喝撑了难受怎么办 晚饭吃撑了难受怎么办 吃多了肚子难受怎么办 电信4g信号变3g怎么办 五险交了3月离职怎么办 怎么办工行携程灵通卡 易买得消费卡怎么办 贷款回执单丢了怎么办 医院挂号过号了怎么办 脑子里总是胡思乱想睡不着怎么办 被妹夫给睡了怎么办 被妹夫抱了下怎么办 最里面牙齿烂了怎么办 老公有外遇不承认怎么办 对老公疑心太重怎么办 当你发现老公出轨怎么办 发现自己老婆出轨了怎么办 笔袋密码忘记了怎么办 海关锁密码忘了怎么办 800度近视献了血怎么办 当老公有了外遇妻子该怎么办 妻子有外遇我该怎么办 喜欢拔粗的头发怎么办 小腿长水泡很痒怎么办 脚丫有水泡又痒怎么办 脚上起水泡怎么办很疼 脚上反复长水泡怎么办 高考没考上二本怎么办