前面的幾節課講解Makefile的一些基本知識也做了一些小例子實踐了幾下,那么到現在普通的練習則是沒有問題。但是如果做項目文件較多又分層次等等還是會碰上好多問題的,這節課補充一些知識。
知識點:1.makefile的內嵌函數;
2.二級目錄Makefile的編寫;
3.多級目錄Makefile的編寫;
原理:GNU make還提供了相關的函數來幫助我們編寫此文件,使得我們在編寫makefile文件時更加靈活健壯。提供的函數大致分為有:處理文件名、文本內容、變量、命令四種;在這節中不會講太多的函數甚至連最基本的去空格、排序、過濾功能函數也不會,只需要幾個就可以了。有了這些函數就能幫我們很好的處理具有二級多級目錄文件的編譯工作。
make函數接下來講解幾個常用的函數。
實踐: 1.內嵌函數1.1 函數的調用格式類似于變量的引用用$開始,具體如下:
$(FUNCTION ARGUMENTS)#也可以是如下:${FUNCTION ARGUMENTS}
這里需要注意下:FUNCTION則是make內嵌的函數名稱,如果是用戶自己的需要用call間接調用;ARGUMENTS則是函數的參數多個使用都好分隔,所以參數中不能有都好分隔否則出錯。
1.2 常見的幾個
1.2.1 $(wildcard PATTERN):列出當前目錄下匹配的文件、文件夾;例如列出當前目錄下的所有目標.o文件:src=$(wildcard *.o)。
1.2.2$(patsubst PATTERN,REPLACEMENT,TEXT):在TEXT文本中符合PATTERN模式的講替換成REPLACEMENT,例如把推導出calc.o,calcmain.o其calc.c和calcmain.c:
OBJECTS=calc.o calcmain.o$(patsubst %.o,%.c,$(OBJECTS)) #(OBJECTS:.o=.c)也可以用
1.2.3$(shell 命令):執行shell命令,例如執行列出當前目錄的所有文件夾:
$(shell ls -d */)
1.2.4$(findstring FIND,IN):在IN字符串里面查找FIND字符,如果存在則返回FIND,否則返回為空;
$(findstring a,abcd) #存在返回a2. Makefile文件支持二級目錄
2.1 先建立環境,看如下代碼:
mkdir gcc04cd gcc04mkdir ui #界面代碼庫 mkdir dal #數據訪問庫mkdir bll #業務邏輯庫cd uitouch ui.c ui.hcd ../daltouch dal.c dal.hcd ../blltouch bll.c bll.h
在對ui、dal、bll模塊下編寫一些簡單的測試代碼:
#ui.c文件#include <stdio.h>#include "ui.h"void PRint_UI(const char* str){ printf(str); }#ui.h文件#ifndef _UI_H#define _UI_Hvoid print_UI(const char* str);#endif#dal.c文件#include <stdio.h>#include "dal.h"void print_DAL(const char* str){ printf(str); }#dal.h文件#ifndef _DAL_H#define _DAL_Hvoid print_DAL(const char* str);#endif#bll.c文件#include <stdio.h>#include "bll.h"void print_BLL(const char* str){ printf(str); }#bll.h文件#ifndef _BLL_H#define _BLL_Hvoid print_BLL(const char* str);#endif
下面看下Makefile文件:
CC=gccCFLAGS=-Wall -gBIN=mainSUBDIR=$(shell ls -d */)ROOTSRC=$(wildcard *.c)ROOTOBJ=$(ROOTSRC:%.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文件,至于其意思前面也有相對應的解析了,這個
SUBDIR變量也注意下它是當前目錄下目錄的集合后面通過find命令查找出這些對于目錄下的.c文件; 上面的代碼只能支持到二級目錄,代碼是由SUBDIR決定了它只找到了二級目錄的文件!現在想想如果是二級目錄下還有目錄即是多級目錄Makefile編寫(也可以是Makefile生成多個可執行文件)那怎么辦呢,有什么辦法了解決呢?這里就需要用到一個命令:make bll/ TARGET=all ;其中all是可執行文件或是偽目標。下面看看二級目錄的Makefile文件的編寫:
SUBDIRS=test #定義二級目錄.PHONY:default all clean $(SUBDIRS) #定義多個偽目標default:all #這個相當于每月作用后面沒命令all clean: #all 或是 clean 就執行下面命令,但是是沒有依賴文件,也就是直接執行命令 $(make) $(SUBDIRS) TARGET=$@ #這句相當于:make test TARGET=all$(SUBDIRS) # $(make) -C $@ $(TARGET) #進入文件夾傳遞all調用Makefile,命令其實就是:make -C test/Makefile all
test目錄下的Makefile文件:
CC=gccBIN=testOBJS=test.oCFLAGS=-Wall -g.PHONE: all clean print #傳遞allall:print $(BIN) #目的是打印信息print: @echo "make in $(BIN)......"$(BIN):$(OBJS) $(CC) $(OBJS) -o $@.o:.c $(CC) -c $<clean: @echo "rm......" rm -f $(BIN) #(OBJS)
相信這個代碼都能明白了,下面的就不注釋比較簡單跟之前的一樣。這個在進入跟退出文件夾時會有輸出這樣在看起來高大上哦?。。?/p>
新聞熱點
疑難解答