一、notdir簡介
notdir是GNU Make中的一個函數,主要用於提取指定路徑中的文件名部分(即去掉路徑),返迴文件名部分。其語法為:
$(notdir )其中,<names>參數是需要處理的文件名列表,可以包含通配符。
notdir函數將返回參數中每個文件名的文件名部分,返回的結果以空格分隔。如果<names>中某個元素缺少路徑,結果仍然是元素本身。如果不傳入參數,則返回一個空字符串。
二、notdir的使用方法
notdir可以配合其他函數一起使用,如sort、filter等。下面分別以這些函數為例進行介紹。
1.與sort結合使用
sort函數可以對文件名列表進行排序,與notdir搭配使用可以返回排序後的文件名列表(只包含文件名部分)。例如:
DIRS := src/test/dir1 src/test/dir2 src/test/dir3
SRCS := $(wildcard $(addsuffix /*.c,$(DIRS)))
OBJS := $(sort $(notdir $(SRCS:.c=.o)))在上述代碼中,先定義了三個路徑,分別是src/test/dir1、src/test/dir2和src/test/dir3,然後使用wildcard函數列出每個文件夾下以.c結尾的所有文件,再使用$(SRCS:.c=.o)將文件後綴名替換為.o。
最後使用notdir函數獲取每個文件名的文件名部分,然後再將它們排序,得到需要編譯的文件名列表。經過上述處理,$(OBJS)的值將為「dir1.o dir2.o dir3.o」。
2.與filter結合使用
filter函數可以將文件名列表中符合條件的文件名篩選出來,與notdir搭配使用可以返回篩選後的文件名列表(只包含文件名部分)。例如:
FILES := file1.txt file2.c file3.c file4.h
SRCS := $(filter %.c,$(FILES))
OBJS := $(notdir $(SRCS:.c=.o))在上述代碼中,定義了一個文件名列表FILES,並使用filter函數找出其中以.c結尾的文件。然後再將文件後綴名替換為.o,使用notdir函數返回每個文件名的文件名部分。
經過上述處理,$(OBJS)的值將為「file2.o file3.o」。
三、notdir的實戰應用
1.使用notdir對不同文件夾下的文件進行編譯
在GNU Make中,我們可以使用VPATH參數來解決源文件存在不同目錄的問題。VPATH變量定義了一組目錄以供Make在其中搜索文件。如果源文件在這些目錄之一中,則相應的.o文件也生成在對應的目錄下。
VPATH = src:test:main
SRCS := $(wildcard src/*.c test/*.c main/*.c)
OBJS := $(notdir $(SRCS:.c=.o))
.PHONY: all
all: $(OBJS)
$(OBJS):%.o:%.c
gcc -c $< -o obj/$@在上述代碼中,VPATH定義了搜索目錄,分別是src、test和main,這些目錄下存在.c文件。使用wildcard函數獲取每個目錄下的.c文件。
接着使用notdir函數獲取每個.c文件的文件名部分,並將文件後綴名替換為.o。最後使用gcc進行編譯,指定輸出的目錄為obj。
2.使用notdir和wildcard分別獲取某文件夾下的特定類型文件和文件夾列表
我們經常需要獲取某個目錄下的所有特定類型的文件列表以及所有的子文件夾列表。使用notdir和wildcard可以輕鬆地實現這一需求。
SRC_DIR := src
SRC_FILES := $(wildcard $(SRC_DIR)/*.c)
SRC_OBJS := $(notdir $(SRC_FILES:.c=.o))
SUBDIRS := $(notdir $(wildcard $(SRC_DIR)/*/))
.PHONY: all
all:
@echo "源文件列表:$(SRC_FILES)"
@echo "目標文件列表:$(SRC_OBJS)"
@echo "子文件夾列表:$(SUBDIRS)"在上述代碼中,先使用wildcard獲取SRC_DIR目錄下的所有.c文件,然後使用notdir函數獲取每個文件的文件名部分,替換為.o。
接着使用wildcard獲取SRC_DIR目錄下的所有子文件夾列表,再使用notdir函數獲取每個文件夾的文件夾名部分。
最後,使用echo輸出文件列表和文件夾列表。
四、notdir的示例代碼
VPATH = src:test:main
SRCS := $(wildcard src/*.c test/*.c main/*.c)
OBJS := $(notdir $(SRCS:.c=.o))
.PHONY: all
all: $(OBJS)
$(OBJS):%.o:%.c
gcc -c $< -o obj/$@
SRC_DIR := src
SRC_FILES := $(wildcard $(SRC_DIR)/*.c)
SRC_OBJS := $(notdir $(SRC_FILES:.c=.o))
SUBDIRS := $(notdir $(wildcard $(SRC_DIR)/*/))
.PHONY: all
all:
@echo "源文件列表:$(SRC_FILES)"
@echo "目標文件列表:$(SRC_OBJS)"
@echo "子文件夾列表:$(SUBDIRS)"原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/159117.html
微信掃一掃
支付寶掃一掃