[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. MUI DtPicker 显示自定义日期

    MUI地址:http://dev.dcloud.net.cn/mui/ 首先引入相关JS CSS脚本. HTML代码: <input class="dt flat" styl ...

  2. 使用nvm进行node多版本管理

    nvm与Python的virtualenv和Ruby的rvm类似.NVM (Node Version Manager,Node多版本管理器)是一个通用的叫法,它目前有许多不同的实现.通常我们说的 nv ...

  3. Redis进阶之redis的生命周期

    D:\Redis-x64-3.2.100>redis-cli.exe -h 127.0.0.1 -p 6379127.0.0.1:6379> set aa "123"( ...

  4. Spring AOP项目应用——方法入参校验 & 日志横切

    转载:https://blog.csdn.net/Daybreak1209/article/details/80591566 应用一:方法入参校验 由于系统多个方法入参均对外封装了统一的Dto,其中D ...

  5. Oracle 12c: RMAN restore/recover pluggable database

    查看数据库状态 运行在归档模式,可拔插数据库name=pdborcl SQL> archive log list; Database log mode Archive Mode Automati ...

  6. orocos_kdl学习(一):坐标系变换

    KDL中提供了点(point).坐标系(frame).刚体速度(twist),以及6维力/力矩(wrench)等基本几何元素,具体可以参考 Geometric primitives 文档. Creat ...

  7. 保持APP后台NSTimer运行

    [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:nil]; self.timer = [NSTi ...

  8. s3cmd用法总结

    概述 S3是亚马逊AWS提供的简单存储服务(可以理解为有公网域名的大容量高可用存储) S3配合CloudFront服务可作为CDN使用,它提供多节点全球发布 安装 方法一: yum install s ...

  9. s:if 标签 字符串比较 正确用法和错误用法

    transaction.tjpopState 该对象在后台是枚举类型,在前台需要转为字符串才能比较. 错误一: <s:if test='transaction.tjpopState!=" ...

  10. A Tale of Three Apache Spark APIs: RDDs, DataFrames, and Datasets(中英双语)

    文章标题 A Tale of Three Apache Spark APIs: RDDs, DataFrames, and Datasets 且谈Apache Spark的API三剑客:RDD.Dat ...