(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測試結果如下
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章