linux之Makefile(下)


一、make常用内嵌函数
函数调用个是

   $(function arguments)

1、 $(wildcardPATTERN)
(1)当前目录下匹配模式的文件
(2)例如:src=$(wildcard *.c), 匹配的src就是所有的.c文件列表

2、 $( patsubst PATTERN,REPLACEMENT,TEXT)
(1) 模式替换函数
(2)例如:$(patsubst %.c,%.o,$src), src 所有的.c文件都替换成.o文件
(3) 等价于$(src:.c=.o),采用这种方式,更直观 

3、 shell 函数
(1) 执行 shell 命令
(2)例如:$(shell ls –d */) ,“/”代表将所有子文件夹都列出来



二、多级目录Makefile

CC      = gcc  

CFLAGS  =-Wall -g

BIN     = main 

SUBDIR  = $(shell ls -d */) #将所有子文件夹都列出来保存SUBDIR中

ROOTSRC= $(wildcard *.c) #当前路径下所有的.c文件

ROOTOBJ= $(ROOTSRC:%.c=%.o) #ROOTSRC所有的.c文件都替换成.o文件

SUBSRC  = $(shell find $(SUBDIR) -name '*.c') #将子文件夹底下所有的.c文件

SUBOBJ  = $(SUBSRC:%.c=%.o) #将子文件夹底下所有的.c文都替换成.o文件

$(BIN):$(ROOTOBJ)$(SUBOBJ) #将所有的.o文件生成可执行文件

        $(CC) $(CFLAGS) -o $(BIN) $(ROOTOBJ)$(SUBOBJ)

.c.o:

        $(CC) $(CFLAGS) -c $< -o $@

clean:

        rm -f $(BIN) $(ROOTOBJ) $(SUBOBJ)



三、多级目录生成子文件夹底下的多个目标文件 (1)文件1:Makefile
SUBDIRS = test1 test2
.PHONY:default all clean $(SUBDIRS)
default:all

all clean:
    $(MAKE) $(SUBDIRS) TARGET=$@  
$(SUBDIRS):
    $(MAKE) -C $@ $(TARGET)

(2)文件2:test1/Makefile
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)

(3)文件3:test2/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)

(4)解释:
$(MAKE)=make
make all test1/Makefile

make all test2/Makefile


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值