<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      輕松玩轉makefile | 函數的使用

      前言

      在上一篇文章中,盡管使用了變量和模式,但還是有不夠好的地方,在Makefile中要指明每一個源文件,我們接下來利用函數對其進行優化,并介紹其他常用的一些函數。

      依舊是以fun.c ,main.c 和Makefile三個文件為例,文件內容就不再貼出來了,前兩篇文章中都有。

      1.wildcard函數

      wildcard是通配符函數,通過它可以得到當前工作目錄中滿足 _pattern模式的文件或目錄名列表。

      格式為:$(wildcard _pattern)

      .PHONY:all	
      
      SRC = $(wildcard *.c)
      
      all:
      	@echo $(SRC)
      

      運行make

      fun.c main.c
      

      2.patsubst函數

      patsubst 函數被用來將名字列表 _text中符合 _pattern模式的名字替換為 _replacement,并將替換后的名字列表返回。

      格式為:$(patsubst _pattern, _replacement , _text)

      .PHONY:all
      
      SRC = fun.c main.c
      objects := $(patsubst %.c, %.o, $(SRC))
      all:
      	@echo $(objects)
      

      運行make

      fun.o main.o
      

      有了這個兩個函數,我們可以對之前的makefile進行優化

      優化前

      .PHONY:clean
      
      CC = gcc
      RM = rm
      
      TARGET = app
      OBJS = main.o fun.o
      
      $(TARGET) : $(OBJS)
      	$(CC) -o $@ $^
      %.o : %.c
      	$(CC) -o $@ -c $^
      clean:
      	$(RM) $(TARGET) $(OBJS)
      

      優化后

      .PHONY:clean
      
      CC = gcc
      RM = rm
      
      TARGET = app
      SRCS = $(wildcard *.c)
      OBJS = $(patsubst %.c, %.o, $(SRCS))
      
      $(TARGET) : $(OBJS)
      	$(CC) -o $@ $^
      %.o : %.c
      	$(CC) -o $@ -c $^
      clean:
      	$(RM) $(TARGET) $(OBJS)
      

      3.abspath函數

      abspath函數被用于將 _names中的各路徑名轉換成絕對路徑,并將轉換后的結果返回。

      格式為:$(abspath _names)

      .PHONY:all
      
      ROOT := $(abspath /usr/../lib)
      
      all:
      	@echo $(ROOT)
      
      

      運行make

      /lib
      

      4.addprefix函數

      addprefix函數被用于給名字列表 _names中的每一個名字增加前綴 _prefix,并將增加了前綴的名字列表返回。

      格式為:$(addprefix _prefix, _names)

      .PHONY:all
      
      without_dir := fun.c main.c
      with_dir := $(addprefix objs/, $(without_dir))
      
      all:
      	@echo $(with_dir)
      

      運行make

      objs/fun.c objs/main.c
      

      5.addsuffix函數

      addsuffix函數被用于給名字列表 _names中的每一個名字增加后綴 _suffix,并將增加了后綴 _suffix的名字列表返回。

      格式為:$(addsuffix _suffix, _names)

      .PHONY:all
      
      without_suffix := funA funB
      with_suffix := $(addsuffix .c, $(without_suffix))
      
      all:
      	@echo $(with_suffix)
      

      運行make

      funA.c funB.c
      

      6.filter函數

      filter函數被用于從一個名字列表 _text中根據模式 _pattern得到滿足需要的名字列表并返回。

      格式為:$(filter _pattern, _text)

      .PHONY:all
      
      sources = fun.c main.c other.o test.h
      sources := $(filter %.c %.o, $(sources))
      
      all:
      	@echo $(sources)
      
      # touch other.o test.h
      # ls
      fun.c  main.c  Makefile  other.o  test.h
      

      運行make,可以看到,調用filter函數后,sources變量中只會有.c和.o的文件, .h文件不符合要求被過濾了

      fun.c main.c other.o
      
      

      7.filter-out函數

      filter-out函數被用于從名字列表 _text中根據模式 _pattern濾除一部分名字,并將濾除后的列表返回。

      格式為:$(filter-out _pattern, _text)

      .PHONY:all
      
      objects = funA.o funB.o fun.c main.c other.o test.h 
      results = $(filter-out fun%.o, $(objects))
      
      all:
      	@echo $(results)
      

      利用touch命令新建funA.o,funB.o文件,運行make

      fun.c main.c other.o test.h
      

      8.notdir函數

      notdir函數被用來從路徑 _names中抽取文件名,并將文件名返回。

      格式為:$(notdir _names)

      .PHONY:all
      
      file_name := $(notdir code/src/fun.c code/src/main.c)
      all:
      	@echo $(file_name)
      

      運行make

      fun.c main.c
      

      9.realpath函數

      realpath函數被用于獲取names所對應的真實路徑名。

      格式為:$(realpath _names)

      .PHONY:all
      
      ROOT := $(realpath ./..)
      
      all:
      	@echo $(ROOT)
      

      運行make

      /mnt/hgfs/Work/Makefile/3.2
      

      10.strip函數
      strip函數可以將將 _string 中的多余空格去除后返回。

      格式為:$(strip _string)

      .PHONY:all
      
      orginal := fun.c       main.c
      stripped := $(strip $(orginal))
      
      
      all:
      	@echo "original =  $(orginal)"
      	@echo "stripped =  $(stripped)"
      

      運行make

      original =  fun.c       main.c
      stripped =  fun.c main.c
      

      小結

      本文介紹了一些常用的函數,只要加以靈活運用,會讓你的Makefile變得高效又智能。
      ————————————————————————————————

      碼字不易,點個贊再走吧!

      歡迎關注我的同名公眾號,這里有更多好料等著你哦!

      posted @ 2023-03-03 15:40  知微之見  閱讀(274)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲AV无码精品色午夜果冻| 亚洲春色在线视频| 国产一区二区黄色在线观看| av深夜免费在线观看| 久久99热只有频精品8| 成人午夜无人区一区二区| 永久免费AV无码国产网站| 亚洲av男人电影天堂热app| 国产一区二区三区小说| 韩国一级毛片中文字幕| AV秘 无码一区二| 日韩卡一卡2卡3卡4卡| 国产区精品福利在线观看精品| 久久久久久无码午夜精品直播| 亚洲精品中文综合第一页| 精品少妇av蜜臀av| 黑人好猛厉害爽受不了好大撑| 久久精品国产99久久美女| 国产最新精品系列第三页| 西西444www高清大胆| 国产精品伦人视频免费看| 欧美日韩在线亚洲二区综二| 亚洲国产成人无码影院| 中文午夜乱理片无码| 高清国产av一区二区三区| 亚洲欧美日韩精品久久| 思南县| 四虎国产精品成人免费久久| 国产av一区二区三区综合| 啊灬啊灬啊灬快灬高潮了电影片段 | 丁香婷婷色综合激情五月| 国产精品亚洲av三区色| 女人腿张开让男人桶爽| 亚洲码和欧洲码一二三四| 999久久久免费精品播放| 欧美白妞大战非洲大炮| 男女xx00xx的视频免费观看| 欧美熟妇乱子伦XX视频| 久久亚洲精品无码播放| av天堂久久天堂av| 国产系列丝袜熟女精品视频|