(P4)Linux开发工具—Makefile下

1.make常用内嵌函数

  • 函数调用
$(function arguments)1)$(wildcard PATTERN)		
当前目录下匹配模式的文件
eg:
src=$(wildcard *.c)				匹配所有的.c文件,所有.c文件列表保存到src变量中


(2)$(patsubst PATTERN, REPLACEMENT, TEXT)
模式替换函数
eg:
$(patsubst %.c,%.o,$src)		.c的后缀名都替换成.o
等价于
$(src:.c=.o)		用的多

(3)shell函数
执行shell命令
eg:
$(shell ls -d */)

2.多级目录Makefile

  • eg1:
    (1)多级目录如下:04make\01
    在这里插入图片描述
    (2)多级目录的含义如下:
    bll:业务逻辑层
    dal:数据层
    ui:界面层
main.c中有代码,代码如下:
int main(void)
{
    return 0;
}

================Makefile中的代码如下============
CC= gcc
CFLAGS=-Wall -g
BIN=main
SUBDIR=$(shell ls -d */)		##SUBDIR保存子文件夹列表
ROOTSRC=$(whildcard *.c)		##当前文件夹下的.c,当前是main.c
ROOTOBJ=$(ROOTSRC:%.c=%.o)
SUBSRC=$(shell find $(SUBDIR) -name '*.c')		##实际上是:find bll dal ui -name '*.c'		
SUBOBJ=$(SUBSRC:%.c=%.o)						##子文件下所有的.c文件保存在SUBSRC
$(BIN):$(ROOTOBJ) $(SUBOBJ)
	$(CC) $(CFLAGS) -o $(BIN) $(ROOTOBJ) $(SUBOBJ)
.c.o:			##所有的.c生成,或者%.o:%.c
	$(CC) $(CFLAGS) -c $< -o $@
clean:
	rm -f $(BIN) $(ROOTOBJ) $(SUBOBJ)

  • eg1的测试结果如下:
    在这里插入图片描述

  • eg2:
    (1)多级目录如下:04make\02
    在这里插入图片描述

=================最外层Makefile内容如下:==========================
SUBDIRS=teset1 teset2
.PHONY:default all clean $(SUBDIRS)	##定义了5个伪目标
default:all		##终极目标,default没有命令,会去生成all
all clean:
	$(MAKE) $(SUBDIRS) TARGET=$@		## $(MAKE)就是make,TARGET就是all(执行make all),执行
										##make clean,此时TARGET就是clean。所以clean也会传递到子目录的目标中
$(SUBDIRS):		##SUBDIRS就是test1,test2,会进入这俩子目录去调用子目录的makefile,并将all传递进去
	$(MAKE) -C $@ $(TARGET)

##make -C test1 all,等价于make all test1/makefile,-C表示进入到test1目录



================04make\02\test1\Makefile======================
CC=gcc
BIN=test1
OBJS=test1.o
.PHONY:all clean print
all:print $(BIN)   ##进入该目录执行的是make all,print是伪目标,只会执行动作,不会生成print文件
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)

=================04make\02\test2\Makefile=====================
CXX=gcc
BIN=test2
OBJS=test2.o
CFLAGS=-Wall -g
.PHONY:all clean print
all:print $(BIN)   ##进入该目录执行的是make all,print是伪目标,只会执行动作,不会生成print文件
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)



  • 如果04make\02\test1下还有子文件夹,写法就是将04make\02\test1下的Makefile仿照最外层的Makeflie去写即可
  • eg2测试结果如下
    在这里插入图片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章