makefile学习之路——makefile简介

一、make简介

make是一个指令工具,它解释makefile中的指令或者说规则。makefile文件描述了整个工程中所有文件的**编译顺序,编译规则**。Makefile也有自己的编写规则,通常,我们所使用的IDE都会生成相应的makefile,然后再根据makefile来进行编译,只是这些操作是由IDE来完成,我们只需要点击一个编译按钮。

二、为什么要使用make

现在可以在GitHub上看到,很多的开源项目,在编译的时候,都是使用make来完成的,也就是说,都有其对应的makefile。他们都有个特点,那就是文件很多。

考虑这样一种情况,我们的项目现在有三、四十个文件,你使用的不是IDE工具,而是命令行,那么不同的人,在编译你的项目的时候,都需要一个一个文件的

gcc -o asample.c bsample.c ...... xxx.out

,这样慢慢的一个文件,一个文件的去找到以后再编译吗?

答案肯定是否定的,当你工程的文件多了以后,时间一长,可能你自己都不能记住所有的文件。所以,这个时候我们就可以使用make来根据makefile对整个项目进行管理。除此之外,make还有一个优点,那就是当你修改你的文件以后,make只会编译更新的文件以及它相关依赖的文件。这里后边进行详细的解释,意思就是,当你只修改了几十个文件中的某一个文件时,make只会重新编译跟你修改的文件有关联的文件,而不是所有的文件。这就大大的减短了编译的时间。

三、makefile简介

在我们执行make之前,需要有一个名为makefile或Makefile的文件。这个文件用来告诉make需要完成什么样的操作。我们可以简单的把makefile认为是一份定义了源文件间依赖关系、如何编译各个源文件并生成可执行文件的说明书。

四、makefile的基本结构

TARGET... : PREREQUISITES...
    COMMAND
    ...
    ...

TARGET:规则的目标,最终生成文件的名字或者是中间过程文件名,也可以是make执行的动作的名称。

PREREQUISITES:规则的依赖,生成目标所必须的文件名列表。

COMMAND:规则的命令。规则需要执行的动作

注意:这里需要注意的是,命令前面使用的是TAB键,而不是空格,使用空格会出现错误。

五、第一个makefile

makefile文件内容如下

hello : 
    echo "hello makefile"
test : 
    echo "test"
    pwd
    ls

执行结果如图所示

从图中可以看到,我们执行make时,打印了echo "hello makefile"hello makefile两句话。使用make hello的结果跟make相同,而使用make test,的打印结果,则与前面两者不同。

为什么会是这样呢?

因为make在执行时,如果没有参数,那么就会首先执行第一个规则,而make hellomake test则是执行对应目标下的规则,所有,虽然makemake hello的结果是相同的,但是实际上,两者的意义还是有区别的。

原文地址:http://blog.51cto.com/12876518/2088329

时间: 03-17

makefile学习之路——makefile简介的相关文章

Makefile学习之路——4

变量的类别有递归扩展变量和简单扩展变量.只用一个"="符号定义的变量被称为递归扩展变量.通过下面例子观察递归扩展变量的特点. 1 .PHONY: all 2 3 foo=$(bar) 4 bar=$(ugh) 5 ugh=Huh? 6 7 all: 8 @echo $(foo) 从结果来看,递归扩展变量的引用是递归的. CFLAGS =$(CFLAGS) -O 上面的赋值代码将会造成一个死循环,无限递归. 简单变量扩展使用" :="操作符来定义的.对于这种变量,ma

Makefile学习之路5——通过函数增强功能

通过函数能显著增强Makefile的功能.对于simple项目的Makefile,尽管使用了模式规则,但还是有一件比较麻烦的事情,就是要在Makefile中指明每一个项目源文件.下面介绍几个后期会使用到的函数,更多请参考<GUN Make>. 1.abspath函数 从命名就应该能够猜出它的作用.abspath函数用于将_name中的各路径名转化成绝对路径,并将转化后的结果返回.调用形式为: $(abspath _name) 1 .PHONY: all 2 root :=$(abspath /

makefile学习之路——变量

在makefile中,支持程序设计语言中变量的概念,所有的变量只代表文本数据. 一.变量的定义和使用 #变量的定义 CC := gcc TARGET := hello.out #变量的使用 $(TARGET) : func.o main.o     $(CC) -o $(TARGET) func.o main.o 二.变量的赋值方式 1. 简单赋值        := 只针对当前语句的变量有效 2. 递归赋值        = 赋值操作可能影响多个其他变量,所有与目标变量相关的其他变量都将受到影

【OAuth2学习之路】简介

OAuth是什么? OAuth是Open Authorization(开放授权)的简写,是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. OAuth允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据.每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频).这样,OAuth让用户可以授权第三方网站访问

【Linux学习】Makefile学习(二)

FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 40975    Accepted Submission(s): 13563 Problem Description FatMouse prepared M pounds of cat food, ready to trade with the cats g

Makefile学习笔记

第一部分.概述  什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂.这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义.特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力. 因为,makefile关系到了整个

MakeFile 学习

MakeFile 学习 1.静态模式 objects = foo.o bar.o all: $(objects) $(CC) $(CFLAGS) -o -o [email protected] $^ $(objects): %.o: %.c $(CC) -c $(CFLAGS) $< -o [email protected] 上面的例子中,指明了我们的目标从$object中获取,"%.o"表明要所有以".o"结尾的目标,也就是"foo.o bar.o

[转]Windows平台下Makefile学习笔记

Windows平台下Makefile学习笔记(一) 作者:朱金灿 来源:http://blog.csdn.net/clever101 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译平台的问题(发现一些开源代码已经在使用VS2010开发,但我还没安装VS2010,我想在VS2008下编译这些代码):另一方面源码在服务器端编译的话,使用IDE的方式编译还是不太方便. 本文主要分为三部分:第一部分讲述namke工具使用makefile的用法:第二部分讲述makefile的主要语法:

Python学习之路【第一篇】-Python简介和基础入门

1.Python简介 1.1 Python是什么 相信混迹IT界的很多朋友都知道,Python是近年来最火的一个热点,没有之一.从性质上来讲它和我们熟知的C.java.php等没有什么本质的区别,也是一种开发语言,而且已经进阶到主流的二十多种开发语言的top 5(数据源自最新的TIOBE排行榜). 来头不小啊!二十多种主流的开发语言,我该从哪一个开始呢?人生苦短,let‘s python! 1.2 Python的由来和发展趋势 Python的前世源自鼻祖“龟叔”.1989年,吉多·范罗苏姆(Gu