热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

linux开发工具之Makefile(下)

make常用内嵌函数以及多级目录Makefile一、函数调用$(functionarguments),利用$号引用函数,下面是Makefile中常用三个函数:1、$(wildcard

make  常用内嵌函数以及多级目录Makefile

一、函数调用  $(function arguments),利用$号引用函数,下面是Makefile中常用三个函数:

1、$(wildcard PATTERN):wildcard函数

当前目录下匹配模式的文件,例如 src=$(wildcard  *.c),匹配所有的.c文件,生成的src就是所有的.c文件。

3、$(patsubst PATTERN , REPLACEMENT , TEXT) : patsubst是一个模式替换函数 

例如$(patsubst  %.c ,%.o,$src)  等价于  $(src:.c=.o) ,将src中所有.c文件替换为.o文件

4、shell函数

执行shell命令,例如$(shell  ls -d */)  :将当前文件夹下面的所有文件夹列出来。

 

二、二级目录Makefile

CC        =gcc
CFLAGS    =-Wall -g
BIN       =main
SUBDIR    =$(shell ls -d */)               #当前目录下的所有文件夹
ROOTSRC   =$(wildcard *.c)          #查找当前目录下所有.c文件
ROOTOBJ   =$(ROOTSRC:%.c=%.o)        #将.c文件名替换成.o文件名
SUBSRC    =$(shell find $(SUBDIR) -name '*.c')
SUBOBJ    =$(SUBSRC:%.c=%.o)

$(BIN):$(ROOTOBJ)  $(SUBOBJ)                  #第一个目标是总的目标
    $(CC) $(CFLAGS) -o $(BIN) $(ROOTOBJ) $(SUBOBJ)
.c.o:
    $(CC) $(CFLAGS)    -c $<-o $@
clean:
    rm -f $(BIN) $(ROOTOBJ) $(SUBOBJ)

 

三、将每个目录下的文件都生成一个可执行文件(多级目录Makefile):

这个Makefile是递归执行,假设有一个目录,包含一个Makefile文件和两个目录test1  test2。其中test1目录下包含:test1.c 、Makefile 。test2目录下包含test2.cpp、Makefile。

首先看一下主目录下的Makefile:

SUBDIRS    =test1  test2
.PHONY:default  all  clean  $(SUBDIRS)     #一共5个伪目标
default :all
    
all  clean:
       $(MAKE)  $(SUBDIRS)  TARGET=$@           #  $(MAKE)相当于make,这句相当于 make  test1  test2  TARGET=all,并进入当前目录。同理执行make clean也是给子目录传递clean
$(SUBDIRS):
        $(MAKE)  -C  $@  $(TARGET)        #将TARGET(all)传递到下一层目录,make -C进入子目录,再执行make命令。这一行生成test1 test2. (make -C test1 all)等价于make all test1/Makefile
make的递归执行,make的“-C”选项,是首先进入子目录而后再执行make。进入test1中的Makefile后,查看一下test1中Makefile内容:进入子目录之后,执行make all,要生成all,先 生成print与$(BIN)
CC    =gcc
BIN   =test1
OBJS  =test1.o
.PHONY:    all     clean    print
all:print  $(BIN)
print:
        @echo    "----  make all  in  $(PWD)  ----"
$(BIN):$(OBJS)
        $(CC)    $(OBJS)    -o   $@
%.o:%.c
        $(CC)    -c    $<
clean:
        @echo    "----  make clean  in  $(PWD)  -----"
        rm  -f  $(BIN)    $(OBJS)

同理进入test2目录下,对于test2.cpp,该目录下的Makefile文件如下:

CXX         =g++
BIN         =test2
OBJS        =test2.o
CPPFLAGS    =-Wall -g
.PHONY:    all clean print
all:print  $(BIN)
print:
        @echo    "---- make all  in $(PWD) ----"
$(BIN):$(OBJS)
        $(CXX)    $(OBJS)    -o    $@
%.o:%.cpp
        $(CXX)    -c       $<
clean:
        @echo    "---- make clean in $(PWD) ----"
        rm -f $(BIN)    $(OBJS)

 


推荐阅读
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • 【爬虫】关于企业信用信息公示系统加速乐最新反爬虫机制
    ( ̄▽ ̄)~又得半夜修仙了,作为一个爬虫小白,花了3天时间写好的程序,才跑了一个月目标网站就更新了,是有点悲催,还是要只有一天的时间重构。升级后网站的层次结构并没有太多变化,表面上 ... [详细]
  • 巧用arguments在Javascript的函数中有个名为arguments的类数组对象。它看起来是那么的诡异而且名不经传,但众多的Javascript库都使用着它强大的功能。所 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • PHP中的单例模式与静态变量的区别及使用方法
    本文介绍了PHP中的单例模式与静态变量的区别及使用方法。在PHP中,静态变量的存活周期仅仅是每次PHP的会话周期,与Java、C++不同。静态变量在PHP中的作用域仅限于当前文件内,在函数或类中可以传递变量。本文还通过示例代码解释了静态变量在函数和类中的使用方法,并说明了静态变量的生命周期与结构体的生命周期相关联。同时,本文还介绍了静态变量在类中的使用方法,并通过示例代码展示了如何在类中使用静态变量。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
  • 1.Listener是Servlet的监听器,它可以监听客户端的请求、服务端的操作等。通过监听器,可以自动激发一些操作,比如监听在线的用户的数量。当增加一个HttpSession时 ... [详细]
  • Summarize function is doing alignment without timezone ?
    Hi.Imtryingtogetsummarizefrom00:00otfirstdayofthismonthametric, ... [详细]
  • PLSQL块:PLSQL块都用于解决特定问题,PLSQL块可以有参数,也可以相互调用。PLSQL块可以作为模式对象在Oracle数据库中保存,根据用途可以 ... [详细]
  • 1、PLSQLDeveloper记住登陆密码在使用PLSQLDeveloper时,为了工作方便希望PLSQLDeveloper记住登录Oracle的用户名和密码&#x ... [详细]
author-avatar
大航
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有