一、目標、依賴和命令
makefile中最基本的幾個構成部分就是目標、依賴和命令。目標是我們要生成的文件,依賴是生成目標所需要的文件或者其他目標,命令則是生成目標的具體步驟。
target: dependencies
command
其中,target是一個或多個目標文件,用空格隔開;dependencies是target所依賴的文件或目標,用空格隔開;command則是生成target所需要執行的命令。
二、規則的執行順序
在makefile中,規則的執行順序是從上往下的,因此如果後面的規則需要用到前面的target,我們需要將前面的target寫在後面。
output.txt : input.txt
cat input.txt > output.tmp
mv output.tmp output.txt
clean :
rm output.txt
在上面的makefile中,clean規則是最後一個,我們可以通過執行make clean
來清除target。而在沒有clean規則時,我們可以通過執行make output.txt
來生成target。
三、偽目標
偽目標是一種特殊的目標,其不表示生成文件,而是表示我們在makefile中的一些特定操作,如清除目標等。為了不與文件名衝突,偽目標名通常使用.PHONY表示,我們可以將其定義在makefile中。
.PHONY : clean
clean :
rm *.o myprogram
四、變量
在makefile中,我們可以使用變量來存放一些常量或者需要多次引用的字符串。變量名通常使用大寫字母進行定義,變量的值可以是字符串或者命令結果。我們可以通過$(variable_name)
或者${variable_name}
來引用變量。
CC = gcc
CFLAGS = -c -Wall
all : myprogram
myprogram : file1.o file2.o
$(CC) file1.o file2.o -o myprogram
file1.o : file1.c
$(CC) $(CFLAGS) file1.c
file2.o : file2.c
$(CC) $(CFLAGS) file2.c
clean :
rm *.o myprogram
五、內置函數
在makefile中,我們還可以使用一些內置函數來處理字符串、文件名等。這些內置函數包括文件操作函數、字符串操作函數等。下面是一些常用的內置函數:
$(wildcard pattern)
:匹配文件名,返回一個由空格分隔的文件列表。示例:$(wildcard *.c)
$(patsubst pattern,replacement,text)
:用replacement替換text中匹配pattern的部分。示例:$(patsubst %.c,%.o,foo.c bar.c)
$(subst find,replace,text)
:用replace替換text中所有的find。示例:$(subst foo,bar,foo bar foo)
$(strip string)
:去掉string中開頭和結尾處的空格,並將中間的多個空格縮減為一個。示例:$(strip foo bar )
完整的makefile如下:
CC = gcc
CFLAGS = -c -Wall
SRC_DIR = src
OBJ_DIR = obj
BIN_DIR = bin
TARGET = $(BIN_DIR)/myprogram
SOURCES := $(wildcard $(SRC_DIR)/*.c)
OBJECTS := $(patsubst $(SRC_DIR)/%.c,$(OBJ_DIR)/%.o,$(SOURCES))
.PHONY: all clean
all: $(TARGET)
$(TARGET): $(OBJECTS)
$(CC) $^ -o $@
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -rf $(OBJ_DIR)/*.o $(TARGET)
原創文章,作者:XIPDK,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/371077.html