跟我一起写 Makefile(二)

Makefile怎么?( 在上一节中我们讨论了一下最简单的Makefile如何书,如果大家仿照那个格式过之后肯定会有一个疑问: 这么多的rule,先哪个,后哪个呢? 这里有一个约定:我们要最终生成的target放在第一句,同时我们把这个target也称作我们的default goal 我们再来看一下上节给出的官方例子: edit : main.o kbd.o command.o display.o \ ... 阅读详情

三、make是如何工作的

在默认的方式下,也就是我们只输入make命令。那么,

    1、make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
    2、如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“edit”这个文件,并把这个文件作为最终的目标文件。
    3、如果edit文件不存在,或是edit所依赖的后面的 .o 文件的文件修改时间要比edit这个文件新,那么,他就会执行后面所定义的命令来生成edit这个文件。
    4、如果edit所依赖的.o文件也存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件。(这有点像一个堆栈的过程)
    5、当然,你的C文件和H文件是存在的啦,于是make会生成 .o 文件,然后再用 .o 文件生命make的终极任务,也就是执行文件edit了。

这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦。

通过上述分析,我们知道,像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显示要make执行。即命令——“make clean”,以此来清除所有的目标文件,以便重编译。

于是在我们编程中,如果这个工程已被编译过了,当我们修改了其中一个源文件,比如file.c,那么根据我们的依赖性,我们的目标file.o会被重编译(也就是在这个依性关系后面所定义的命令),于是file.o的文件也是最新的啦,于是file.o的文件修改时间要比edit要新,所以edit也会被重新链接了(详见edit目标文件后定义的命令)。

而如果我们改变了“command.h”,那么,kdb.o、command.o和files.o都会被重编译,并且,edit会被重链接。


四、makefile中使用变量

在上面的例子中,先让我们看看edit的规则:

      edit : main.o kbd.o command.o display.o /
                  insert.o search.o files.o utils.o
            cc -o edit main.o kbd.o command.o display.o /
                       insert.o search.o files.o utils.o

我们可以看到[.o]文件的字符串被重复了两次,如果我们的工程需要加入一个新的[.o]文件,那么我们需要在两个地方加(应该是三个地方,还有一个地方在clean中)。当然,我们的makefile并不复杂,所以在两个地方加也不累,但如果makefile变得复杂,那么我们就有可能会忘掉一个需要加入的地方,而导致编译失败。所以,为了makefile的易维护,在makefile中我们可以使用变量。makefile的变量也就是一个字符串,理解成C语言中的宏可能会更好。

比如,我们声明一个变量,叫objects, OBJECTS, objs, OBJS, obj, 或是 OBJ,反正不管什么啦,只要能够表示obj文件就行了。我们在makefile一开始就这样定义:

     objects = main.o kbd.o command.o display.o /
              insert.o search.o files.o utils.o

于是,我们就可以很方便地在我们的makefile中以“$(objects)”的方式来使用这个变量了,于是我们的改良版makefile就变成下面这个样子:

    objects = main.o kbd.o command.o display.o /
              insert.o search.o files.o utils.o

    edit : $(objects)
            cc -o edit $(objects)
    main.o : main.c defs.h
            cc -c main.c
    kbd.o : kbd.c defs.h command.h
            cc -c kbd.c
    command.o : command.c defs.h command.h
            cc -c command.c
    display.o : display.c defs.h buffer.h
            cc -c display.c
    insert.o : insert.c defs.h buffer.h
            cc -c insert.c
    search.o : search.c defs.h buffer.h
            cc -c search.c
    files.o : files.c defs.h buffer.h command.h
            cc -c files.c
    utils.o : utils.c defs.h
            cc -c utils.c
    clean :
            rm edit $(objects)


于是如果有新的 .o 文件加入,我们只需简单地修改一下 objects 变量就可以了。

关于变量更多的话题,我会在后续给你一一道来。


五、让make自动推导

GNU的make很强大,它可以自动推导文件以及文件依赖关系后面的命令,于是我们就没必要去在每一个[.o]文件后都写上类似的命令,因为,我们的make会自动识别,并自己推导命令。

只要make看到一个[.o]文件,它就会自动的把[.c]文件加在依赖关系中,如果make找到一个whatever.o,那么whatever.c,就会是whatever.o的依赖文件。并且 cc -c whatever.c 也会被推导出来,于是,我们的makefile再也不用写得这么复杂。我们的是新的makefile又出炉了。


    objects = main.o kbd.o command.o display.o /
              insert.o search.o files.o utils.o

    edit : $(objects)
            cc -o edit $(objects)

    main.o : defs.h
    kbd.o : defs.h command.h
    command.o : defs.h command.h
    display.o : defs.h buffer.h
    insert.o : defs.h buffer.h
    search.o : defs.h buffer.h
    files.o : defs.h buffer.h command.h
    utils.o : defs.h

    .PHONY : clean
    clean :
            rm edit $(objects)

这种方法,也就是make的“隐晦规则”。上面文件内容中,“.PHONY”表示,clean是个伪目标文件。

关于更为详细的“隐晦规则”和“伪目标文件”,我会在后续给你一一道来。


六、另类风格的makefile

即然我们的make可以自动推导命令,那么我看到那堆[.o]和[.h]的依赖就有点不爽,那么多的重复的[.h],能不能把其收拢起来,好吧,没有问题,这个对于make来说很容易,谁叫它提供了自动推导命令和文件的功能呢?来看看最新风格的makefile吧。

    objects = main.o kbd.o command.o display.o /
              insert.o search.o files.o utils.o

    edit : $(objects)
            cc -o edit $(objects)

    $(objects) : defs.h
    kbd.o command.o files.o : command.h
    display.o insert.o search.o files.o : buffer.h

    .PHONY : clean
    clean :
            rm edit $(objects)

这种风格,让我们的makefile变得很简单,但我们的文件依赖关系就显得有点凌乱了。鱼和熊掌不可兼得。还看你的喜好了。我是不喜欢这种风格的,一是文件的依赖关系看不清楚,二是如果文件一多,要加入几个新的.o文件,那就理不清楚了。


七、清空目标文件的规则

每个Makefile中都应该写一个清空目标文件(.o和执行文件)的规则,这不仅便于重编译,也很利于保持文件的清洁。这是一个“修养”(呵呵,还记得我的《编程修养》吗)。一般的风格都是:

        clean:
            rm edit $(objects)

更为稳健的做法是:

        .PHONY : clean
        clean :
                -rm edit $(objects)

前面说过,.PHONY意思表示clean是一个“伪目标”,。而在rm命令前面加了一个小减号的意思就是,也许某些文件出现问题,但不要管,继续做后面的事。当然,clean的规则不要放在文件的开头,不然,这就会变成make的默认目标,相信谁也不愿意这样。不成文的规矩是——“clean从来都是放在文件的最后”。


上面就是一个makefile的概貌,也是makefile的基础,下面还有很多makefile的相关细节,准备好了吗?准备好了就来。

<-上一页  下一页->

(版权所有,转载时请注明作者和出处)

unity 在透明物体上投射阴影 unity版本:2019.4.16 创建一个shader,代码如下: Shader "ChuckLee/ARShadow" { Properties { _ShadowColor("Shadow Color", Color) = (0.1, 0.1, 0.1, 0.53) } SubShader { Tags{ "RenderType" = "Transparent" "Queue" = "Geometry+1" } Blend SrcAlpha OneMinusSrcAlph 阅读详情

相关推荐

gtsam官方文档: The new IMU Factor学习笔记

gtsam官方文档:The new IMU Factor 本文为gtsam imu预积分文档学习笔记,为gtsam基于切向量实现的imu预积分的理论基础。 导航状态 定义导航状态为 Xbn={Rbn,Pbn,Vbn}X^n_b=\{R^n_b,P^n_b,V^n_b\}Xbn​={Rbn​,Pbn​,Vbn​} 上角标n:导航(navigation)坐标系 下角标b:载体(body)坐标系 下文均省略上下标 矢量场与微分方程 对于导航问题我们用如下微分方程描述 X˙(t)=F(t,X)\dot X(t)

南柯一梦的博客 1593

跟我一起Makefile.pdf

陈皓大佬的博客最新版跟我一起Makefile.pdf

两个Makefile文件

通过以上两个示例Makefile文件,我们可以轻松地编译和构建C和C++程序,提高开发效率。在命令行中进入源代码所在的目录,输入"make"命令即可自动编译生成目标文件,输入"make clean"命令可以清理生成的目标文件。在软件开发中,Makefile是一种用于自动化编译和构建程序的脚本文件。通过编Makefile文件,可以方便地管理源代码、依赖关系和编译选项等。希望这篇文章对您编自己的Makefile文件有所帮助,如果有任何疑问,请随时向我提问!编两个Makefile文件。表示目标文件的名字,

DevPulse的博客 329

跟我一起 Makefile(完整版)

文章目录作者介绍概述关于程序的编译和链接Makefile 介绍Makefile的规则一个示例make是如何工作makefile中使用变量让make自动推导另类风格的makefile清空目标文件的规则Makefile 总述Makefile里有什么?显式规则隐晦规则变量的定义文件指示注释Makefile的文件名引用其它的Makefile环境变量 MAKEFILESmake的工作方式书规则规则举例规...

whitefish520的博客 5万+

跟我一起 Makefile -- 陈皓

跟我一起 Makefile(一) 概述 关于程序的编译和链接 Makefile 介绍 一、Makefile的规则 、一个示例 跟我一起 Makefile) 三、make是如何工作的 四、makefile中使用变量 五、让make自动推导 六、另类风格的makefile 七、清空目标文件的规则 跟我一起 Makefile(三) Makefile 总述 一、Makefile里有什么? Makefile的文件名 三、引用其它的Makefile 四、环境变量 MAKEFILES 五、mak

qq_35552527的博客 2633

跟我一起 Makefile(整理版)

跟我一起 Makefile 作者:陈皓 跟我一起 Makefile 作者:陈皓 整理:祝冬华 第 1 页共 78 页 2005 年 10 月 14 日整理:祝冬华 跟我一起 Makefile 作者:陈皓 第一部分、概述…6 第部分、关于程序的编译和链接…6 第三部分、Makefile 介绍…7 一、Makefile的规则…7 、一个示例…8 三、make是如何工作的…9 四、makefile中使用变量…10 五、让make自动推导…11 六、另类风格的makefile…12 七、清空目标文件的规则

yangjia_cheng的博客 2770

跟我一起Makefile()

Makefile 总述———————一、Makefile里有什么?Makefile里主要包含了五个东西:显式规则、隐晦规则、变量定义、文件指示和注释。1、显式规则。显式规则说明了,如何生成一个或多的的目标文件。这是由Makefile的书者明显指出,要生成的文件,文件的依赖文件,生成的命令。2、隐晦规则。由于我们的make有自动推导的功能,所以隐晦的规则可以让我们比较粗糙地简略地书Ma...

anwu0979的博客 93

)《跟我一起Makefile》之Makefile介绍

make 命令执行时,需要一个 Makefile 文件,以告诉 make 命令需要怎么样的去编译和链接程序。首先,我们用一个示例来说明 Makefile 的书规则。以便给大家一个感兴认识。这个示例来源于 GNU 的 make 使用手册,在这个示例中,我们的工程有 8 个.c文件,和 3 个头文件,我们要一个 Makefile 来告诉 make 命令如何编译和链接这几个文件。如果这个工程没有编译过,那么我们的所有.c文件都要编译并被链接。如果这个工程的某几个.c文件被修改,那么我们只编译被修改的。

G_tiro的博客 266

跟我一起makefile

上一讲提到了 make是根据文件的时间戳来决定文件要不要重新编译,所以系统时间一定要正确 date来查看系统时间是否正确 补充几点: 每一个规则中的目标,都是一个文件,也可以是一个标签 每一个规则中的目标,不一定要有依赖 每一个目标文件的下方可以没有命令列表 ...

KingOfMyHeart的博客 306

跟我一起Makefile):MakeFile介绍

makefile 介绍 make命令执行时,需要一个 makefile 文件,以告诉make命令如何去编译和链接程序。 首先,我们用一个示例来说明makefile的书规则。以便给大家一个感性认识。这个示例来源于gnu的make使用手册,在这个示例中,我们的工程有8个c文件,和3个头文件,我们要一个makefile来告诉make命令如何编译和链接这几个文件。我们的规则是: 1)如果这个工程

luominghao的专栏 559

跟我一起 Makefile 总述)陈皓

Makefile 总述 ——————— 一、Makefile里有什么? Makefile里主要包含了五个东西:显式规则、隐晦规则、变量定义、文件指示和注释。 1、显式规则。显式规则说明了,如何生成一个或多的的目标文件。这是由Makefile的书者明显指出,要生成的文件,文件的依赖文件,生成的命令。 2、隐晦规则。由于我们的make有自动推导的功能,所以隐晦的规则可以让我们比较粗糙地简...

qq_28090573的博客 245

跟我一起Makefile

三、make是如何工作的在默认的方式下,也就是我们只输入make命令。那么,    1、make会在当前目录下找名字叫“Makefile”或“makefile”的文件。    2、如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“edit”这个文件,并把这个文件作为最终的目标文件。    3、如果edit文件不存在,或是edit所依赖的后面的 .o 文件的文

冷竹的专栏 356

跟我一起Makefile:MakeFile介绍

makefile 介绍make命令执行时,需要一个 makefile 文件,以告诉make命令需要怎么样的去编译和链接程序。首先,我们用一个示例来说明makefile的书规则。以便给大家一个感性认识。这个示例来源于gnu的make使用手册,在这个示例中,我们的工程有8个c文件,

LBY8203XJ的专栏 768

跟我一起Makefile(工程笔记版)

实操如下

假如技术娶了生活... 2218

makefile】跟我一起 Makefile

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

kissdragan的博客 1172

陈皓--跟我一起 Makefile

转至 http://bbs.chinaunix.net/thread-408225-1-1.html 陈皓 概述 —— 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要...

qq_43416810的博客 2290

跟我一起 Makefile(八)

六、多行变量还有一种设置变量值的方法是使用define关键字。使用define关键字设置变量的值可以有换行,这有利于定义一系列的命令(前面我们讲过“命令包”的技术就是利用这个关键字)。 define指示符后面跟的是变量的名字,而重起一行定义变量的值,定义是以endef关键字结束。其工作方式和“=”操作符一样。变量的值可以包含函数、命令、文字,或是其它变量。因为命令需要以[Tab]键开头,所以如果...

威尔软件 432

跟我一起Makefile(整理版)

跟我一起Makefile陈皓(博客地址:http://blog.csdn.net/haoel/article/details/2886)整理的PDF文件:http://download.csdn.net/download/xiaoshuai537/102620891. makefile很重要什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为...

xiaoshuai537的博客 4万+

创业空间入驻协议(简单版).doc

创业空间入驻协议(简单版).doc

上一篇: 跟我一起写 Makefile(一)
下一篇: 跟我一起写 Makefile(三)
haoel
haoel 领域专家: 系统编程技术领域 领域专家: 系统编程技术领域 业界专家认证 业界专家认证
博客等级 码龄27年 2万+粉丝 120原创
评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值