今天继续对Makefile进行研究,话不多说,进入正题:

make常用内嵌函数:
下面利用上面的知识点来实现一个多级目录的Makefile,如下:
多级目录Makefile:
这个例子的目录结构如下:
通过一个Makefile来最终生成一个可执行文件main,那该怎么编写呢?会利用make的内联函数,具体写法如下:
运行如下:
那这个Makefile到底是怎么实现的呢?下面一一对其进行理解:
下面的每句都得好好理解啦,基本就是用的Make中的内联函数,分析如下:
这时,可以在shell命令中执行一下就知道了:
另外得学会,在Makefiile中,怎么去执行shell命令,用上述方式既可,通过这句就可以得到所有子目录了,下面接着分析:
 
 
下面在shell命令中来实践一下就知道了:
 
 
 
通过一步步分析,掌握这种灵活的写法其实也不是很难,在实际项目中挺实用的,当然这里只支持二级目录,多级目录还不支持,但是对于Makefile的学习已经够用了。
【注意】:要想达到通用,则必须用动态的方式去写Makefile,所以在多级目录下,就必须学会用Make当中的内联函数。
接下来再来看一个例子,在实际项目中,有可能一个目录下有一个Makefile,而子目录下也希望生成自己的可执行文件,也就是说,一个Makefile文件,管理了多个目录,并生成多个可执行文件,并不是只是如上个例子的那样,将所有的目录只生成一个可执行文件,那这样的Makefile该怎么编写呢?
先看一下目录结构:
具体表现是怎么样的呢?如下:
 
那主目录的Makefile是怎么管理子目录的Makefile的呢,下面一一来分析,先分析一下主目录的Makefile的含义:
 
那下面对照着make输出语句,一句句进行理解,这种Makefile的写法是比较专业的,所以做为专业人士就得好好理解,如下:
 
 
 
结合make输出来看,正好是这条命令:
 
其中"make test1 test2 TARGET=all"进而会去找test1,test2的生成规则,如下:
 
所以,这时会进行这两个子目录进行生成,并将all传递进去:
 
其中"make -C test1 all"等价于"make all test/Makefile",这时则进入子目录分析一下生成规则
分析一下test1子目录的Makefile的含义,其它子目录的就类似了:
下面来对它进行理解:
 
所以输出如下:
 
 
所以输出如下:
 
至此整个的make传递过程就比较清楚了,如果我们make clean则会将所有子目录里生成的中间文件删除掉:
关于它的Make Clean传递过程跟Make的过程一样,这里就不分析了,总之通过这个专业的Makefile可以实现多级目录的编译,好了,关于Makefile的知识已经补完了,接下来会在实际项目中用到,下回见~

Makefile学习二的更多相关文章

  1. Makefile学习(二)[第二版]

    复杂实例 #演示样例1:在上一个演示样例的基础上再添加一个可运行文件03test[改动之处已标红] .PHONY: clean all CC = gcc CFLAGS = -Wall -g BIN = ...

  2. <转>Windows平台下Makefile学习笔记(二)

    本文转自:http://blog.csdn.net/clever101/article/details/8286066 上次我们学习了怎么用Makefile编译一个控制台工程.这次我们学习一下如何使用 ...

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

    Windows平台下Makefile学习笔记(一) 作者:朱金灿 来源:http://blog.csdn.net/clever101 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译 ...

  4. Android JNI学习(二)——实战JNI之“hello world”

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

  5. makefile学习(1)

    GNU Make / Makefile 学习资料 GNU Make学习总结(一) GNU Make学习总结(二) 这篇学习总结,从一个简单的小例子开始,逐步加深,来讲解Makefile的用法. 最后用 ...

  6. emberjs学习二(ember-data和localstorage_adapter)

    emberjs学习二(ember-data和localstorage_adapter) 准备工作 首先我们加入ember-data和ember-localstorage-adapter两个依赖项,使用 ...

  7. ReactJS入门学习二

    ReactJS入门学习二 阅读目录 React的背景和基本原理 理解React.render() 什么是JSX? 为什么要使用JSX? JSX的语法 如何在JSX中如何使用事件 如何在JSX中如何使用 ...

  8. TweenMax动画库学习(二)

    目录            TweenMax动画库学习(一)            TweenMax动画库学习(二)            TweenMax动画库学习(三)            Tw ...

  9. Hbase深入学习(二) 安装hbase

    Hbase深入学习(二) 安装hbase This guidedescribes setup of a standalone hbase instance that uses the local fi ...

随机推荐

  1. mysql创建用户并授权Repl_slave_priv和Repl_client_priv

    CREATE USER 'test'@'localhost' IDENTIFIED BY 'test'; FLUSH PRIVILEGES; GRANT REPLICATION CLIENT ON * ...

  2. jquery on绑定事件叠加解决方法

    jquery on绑定事件叠加解决方法 代码如下 <pre> $('.maoqiu').each(function () { var is_bind = $(this).attr('is_ ...

  3. 解决Python模块报错:ModuleNotFoundError: No module name 'StringIO'

    下面是我在学习中遇到的问题,给大家分享一下:   ''' 这里是测试代码 '''# coding = utf-8from selenium import webdriverfrom selenium. ...

  4. Windows 下使用 Composer 安装 thinkphp

    我用 XAMPP 安装 thinkphp 会出错,所以把环境换成了 phpStudy,这样甚至不用到处找安装包,直接去官网有最新版本,PHP 版本也是比较新的. 安装 phpStudy 先去官网下载安 ...

  5. 长乐培训Day4

    T1 矩阵 题目 [题目描述] 从前有个 n×m 的矩阵,初始时每个位置均为 0.你需要依次执行 q 个操作,每个操作会指定一行或一列,然后将该行或该列的所有元素全部赋为一个相同的值. 输出操作完成后 ...

  6. 解决SQL server 18740、18456登录失败问题

    第一步:使用window管理员用户登录SQL server 第二步:如下图步骤(开始配置sa默认用户) 第三步:选择角色类型 第四步:选择和配置用户映射的数据库 第五步:授予允许连接,并开启登录权限 ...

  7. 启迪链网通证经济共同体:柏链教育&火聘online推出区块链行业人才“一门式”服务

    近日,启迪链网通证经济共同体旗下两个节点成员柏链教育与火聘online,达成节点间的合作,据悉本次合作是采用共同体的生态共建模式,柏链教育与火聘online共享企业端岗位需求的大数据,然后有针对性的开 ...

  8. AX2009取销售订单的税额

    直接用以下方法即可: Tax::calcTaxAmount(salesLine.TaxGroup, salesLine.TaxItemGroup, systemDateGet(),    salesL ...

  9. Spring Cloud--Hystrix服务熔断(线程隔离/服务降级)代码实现

    一旦服务阻塞就进行服务降级或线程隔离.要不然就会导致大面积服务的瘫痪,Hystrix就是干这个的,一出现不健康的服务就进行熔断,不阻塞后面线程的执行. 引入依赖: 加注解: 这三个注解可以用一个注解搞 ...

  10. Oracle 11g Java驱动包ojdbc6.jar安装到maven库,并查看jar具体版本号

    ojdbc6.jar下载 Oracle官方宣布的Oracle数据库11g的驱动jar包是ojdbc6.jar ojdbc6.jar下载地址:https://www.oracle.com/technet ...