makefile編寫規則詳解

一、目標、依賴和命令

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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
XIPDK的頭像XIPDK
上一篇 2025-04-23 00:48
下一篇 2025-04-23 00:48

相關推薦

  • 解析URI編碼規則

    URI(統一資源標識符)是用來標識互聯網上資源的字符串文本標識符,是訪問互聯網資源的地址。在將URI傳送到服務器或瀏覽器時,需要進行特定編碼處理,這個編碼方式就是URI編碼規則。 …

    編程 2025-04-28
  • Python編寫規則用法介紹

    Python作為一種廣泛使用的高級編程語言,其編寫規則的規範性對於提高代碼可讀性、美觀度以及方便調試、維護至關重要。本文將從命名規則、注釋規則、代碼縮進等多個方面進行詳細的闡述,希…

    編程 2025-04-28
  • Python縮進規則用法介紹

    本文將從多個方面對Python的縮進規則進行詳細的闡述。 一、規則解答 Python中縮進是語法的一部分,它決定了程序的結構和邏輯。Python縮進規則要求同一層級的代碼必須保持相…

    編程 2025-04-28
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁盤中。在執行sync之前,所有的文件系統更新將不會立即寫入磁盤,而是先緩存在內存…

    編程 2025-04-25
  • 神經網絡代碼詳解

    神經網絡作為一種人工智能技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網絡的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網絡模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • Linux修改文件名命令詳解

    在Linux系統中,修改文件名是一個很常見的操作。Linux提供了多種方式來修改文件名,這篇文章將介紹Linux修改文件名的詳細操作。 一、mv命令 mv命令是Linux下的常用命…

    編程 2025-04-25
  • git config user.name的詳解

    一、為什麼要使用git config user.name? git是一個非常流行的分佈式版本控制系統,很多程序員都會用到它。在使用git commit提交代碼時,需要記錄commi…

    編程 2025-04-25
  • Python輸入輸出詳解

    一、文件讀寫 Python中文件的讀寫操作是必不可少的基本技能之一。讀寫文件分別使用open()函數中的’r’和’w’參數,讀取文件…

    編程 2025-04-25
  • 詳解eclipse設置

    一、安裝與基礎設置 1、下載eclipse並進行安裝。 2、打開eclipse,選擇對應的工作空間路徑。 File -> Switch Workspace -> [選擇…

    編程 2025-04-25
  • nginx與apache應用開發詳解

    一、概述 nginx和apache都是常見的web服務器。nginx是一個高性能的反向代理web服務器,將負載均衡和緩存集成在了一起,可以動靜分離。apache是一個可擴展的web…

    編程 2025-04-25

發表回復

登錄後才能評論