[make是什么?]

  make是一个命令工具,是一个解释makefile中指令的命令工具。它可以简化编译过程里面所下达的指令,当执行 make 时,make 会在当前的目录下搜寻 Makefile (or makefile) 这个文本文件,执行对应的操作。make 会自动的判别原始码是否经过变动了,而自动更新执行档。

[为什么要使用make?]

  假设,现在一个项目里面包含了100个程序文件,如果要对这个项目进行编译,那么光是编译指令就有100条。如果要重新进行编译,那么就又得像之前一样重新来一遍。这样重复且繁琐的工作实在是让我们很不爽啊。所以,用make来进行操作,间接调用gcc岂不是很方便?如果我们更动过某些原始码档案,则 make 也可以主动的判断哪一个原始码与相关的目标文件档案有更新过, 并仅更新该档案。这样可以减少重新编译所需要的时间,也会更加方便。

[makefile又是干什么的?]

   makefile其实就是一个文档,里面定义了一系列的规则指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,它记录了原始码如何编译的详细信息!
makefile一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

[定义]

Makefile文件由一系列规则(rules)构成。每条规则的形式如下。

<target> : <prerequisites>
[tab] <commands>

上面第一行冒号前面的部分,叫做"目标"(target),冒号后面的部分叫做"前置条件"(prerequisites);第二行必须由一个tab键起首,后面跟着"命令"(commands)。

目标:

一个目标就构成一条规则。目标通常是文件名,指明make命令要构建的对象,目标可以是一个文件名,也可以是多个文件名。之间用空格分隔。

除了文件名,目标还可以是某个操作的名字(如:clean),这称为是“伪目标”(phony target)

前置条件:

前置条件通常是一组文件名,之间用空格分隔。它指定了"目标"是否重新构建的判断标准:只要有一个前置文件不存在,或者有过更新(前置文件的last-modification时间戳比目标的时间戳新),"目标"就需要重新构建。

命令:

命令(commands)表示如何更新目标文件,由一行或多行的Shell命令组成。它是构建"目标"的具体指令,它的运行结果通常就是生成目标文件。

当你写下一个规则的时候,例如:

unit: output.o test2.o
gcc -o unit output.o test2.o

就是说,让编译器以(output.o  test2.o)为前置条件,使用gcc编译器对这两个目标文件进行链接生成 unit 可执行文件 ,

但是如果(output.o  test2.o)这两个文件中有一个不存在,我们可以在makefile文件中再添加两条规则来生成这个文件.

output.o:test2.h output.c
gcc -c output.c test2.o:test2.h test2.c
gcc -c test2.c

对于两个源文件一个头文件,使用一个完整的makefile文件规定他们之间的编译规则:

unit: output.o test2.o
gcc -o unit output.o test2.o output.o:test2.h output.c
gcc -c output.c test2.o:test2.h test2.c
gcc -c test2.c #删除所有目标文件,并声明clean为伪目标
.PHONY:clean
clean:
rm *.o

执行结果:

Make 处理makefile文件的过程了解一下?

缺省情况下,make开始于第一个目标,这个目标称为缺省最终目标.如上面的makefile文件中的 unit .

这样,当我们在终端敲下 make 命令的时候,Make 就会读取当前目录下的makefile文件,并开始处理第一条规则,本例中就是链接生成unit可执行文件,

但在make全部完成本规则工作之前,必须先处理 unit 所依靠的OBJ文件,这些OBJ文件被按照自己的规则处理更新,每个OBJ文件的更新规则是编译其源文件.如果源文件都没有改变,则不进行重新编译.

其他规则的处理根据他们的目标和缺省最终目标的依赖关系来判断,如果没有任何关联,则不会被执行.除非告诉make强制执行.如:[make clean]

在OBJ文件被重新编译(如果需要的话)之后,make决定是否重新链接生成unit的可执行文件.任何文件有改变的话,则对有依赖的文件进行编译,并生成新的可执行文件.

参考资料:

https://www.cnblogs.com/qiaopei/p/5550168.html

Linux下makefile学习的更多相关文章

  1. Linux下Makefile学习笔记

    makefile 可以用于编译和执行多个C/C++源文件和头文件. (1) #include "file.h" 和 #include <file.h> 的区别 #inc ...

  2. linux 下makefile

    linux下c编程中makefile是必须会的,我刚开始学,将我对makefile的理解记录下来. 通常我们在windows下编写c程序,有各种ide工具为我们执行makefile工作但在linux下 ...

  3. 在linux下makefile的使用

    在linux下makefile的使用

  4. Linux下iptables学习笔记

    Linux下iptables学习笔记 在Centos7版本之后,防火墙应用已经由从前的iptables转变为firewall这款应用了.但是,当今绝大多数的Linux版本(特别是企业中)还是使用的6. ...

  5. 【转载】Linux下makefile详解--跟我一起写 Makefile

    概述 —— 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makef ...

  6. 2.linux下Makefile编写规范

    转自陈皓 (CSDN) 概述—— 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和 profession ...

  7. Linux下MakeFile初探

    make是linux下的编译命令,用于编译和生成Linux下的可执行文件.这个命令处理的对象是Makefile,makefile等.由于make的强大解析能力,makefile文件的编写也变得极为简单 ...

  8. Linux下编程学习一

    本篇主要记录一些在学习LINUX下编程时,, C和C++语言的一些基础的常识, 一. 函数指针 void MyFun(int x); 函数声明 void (*FunP)(int ); 函数指针声明 下 ...

  9. Linux下Makefile的automake生成全攻略--转

    http://www.yesky.com/120/1865620.shtml 作为Linux下的程序开发人员,大家一定都遇到过Makefile,用make命令来编译自己写的程序确实是很方便.一般情况下 ...

随机推荐

  1. Linux 下安装 Mongodb

    mongodb在linux下面的安装应该是很简单的,但是有一个小点需要注意,这也就是我为什么写这篇博客的原因. 首先到其官网上下载最新稳定版,解压到目录,如/usr/local/mongodb 在mo ...

  2. 17、python对内存的使用

    python对内存的使用 浅拷贝和深拷贝 所谓浅拷贝就是对引用的拷贝(只拷贝父对象) 所谓深拷贝就是对对象的资源的拷贝 解释一个例子: import copy a = [1,2,3,['a','b', ...

  3. Selenium support for PhantomJS has been deprecated, please use headless

    今天在使用Selenuim+PhantomJS动态抓取网页时,出现如下报错信息: C:\Python36\lib\site-packages\selenium-3.11.0-py3.6.egg\sel ...

  4. 《学习opencv》笔记——矩阵和图像操作——cvAnd、cvAndS、cvAvg and cvAvgSdv

    矩阵和图像的操作 (1)cvAnd函数 其结构 void cvAnd( //将src1和src2按像素点取"位与运算" const CvArr* src1,//第一个矩阵 cons ...

  5. (98)Address already in use: make_sock: could not bind to address 80 [resolved] (2012-10-11 09:04)

    以前遇到一个问题: sudo /etc/init.d/apache2 start * Starting web server apache2 apache2: Could not reliably d ...

  6. linux一些稍微高级的命令

    cut 命令:提取文件中指定的字段(列).字符内容.单词的默认分隔符为空格. cut [选项]... [文件]... 选项: -b  按照字节切 -c  按照字符切 -d  指定分割符 -f   指定 ...

  7. SNF快速开发平台MVC-Grid++集成打印

    一.显示效果: 二.程序实现: 1.先要在 打印模版程序 给指定页面进行在线设计打印模版 2.在使用的程序当中,增加如下代码即可.程序上是可以挂多个打印模版的,程序页面的代码不用动直接可以读取到打印模 ...

  8. css自适应浏览器大小

    css自适应浏览器大小 1.屏幕 > 900px :显示3列 2.450px < 屏幕 < 900px :显示2列 3.屏幕 < 450px :显示1列 <!DOCTYP ...

  9. AndroidManifest: windowSoftInputMode属性总结

    在Android中,可以通过给Activity设置windowSoftInputMode这个属性来控制软键盘与Activity的主窗口的交互方式. 1. 当Activity成为用户注意的焦点时软键盘的 ...

  10. ES6,新增数据结构Map的用法

    Javascript的Object本身就是键值对的数据结构,但实际上属性和值构成的是”字符串-值“对,属性只能是字符串,如果传个对象字面量作为属性名,那么会默认把对象转换成字符串,结果这个属性名就变成 ...