0
点赞
收藏
分享

微信扫一扫

(P4)Linux开发工具—Makefile下


文章目录

  • ​​1.make常用内嵌函数​​
  • ​​2.多级目录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=$(wildcard *.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的测试结果如下:
  • (P4)Linux开发工具—Makefile下_伪目标

  • eg2:
    (1)多级目录如下:04make\02
  • (P4)Linux开发工具—Makefile下_伪目标_02

=================最外层Makefile内容如下:==========================
SUBDIRS=test1 test2
.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测试结果如下



举报

相关推荐

0 条评论