Makefile 语法入门
一、Makefile 簡介
Makefile 是一種常用于編譯的腳本語言。它可以更好更方便的管理你的項目的代碼編譯,節約編譯時間(沒改動的文件不編譯)。
注意 Makefile 文件命令必須是 Makefile 或者 makefile,并使用 make 命令編譯。
?
二、1個規則
1. 語法規則
目標...: 依賴...命令1命令2...2. 目標
目標即要生成的文件。如果目標文件的更新時間晚于依賴文件的更新時間,則說明依賴文件沒有改動,目標文件不需要重新編譯。否則重新編譯并更新目標。
3. 依賴
即目標文件由哪些文件生成。如果依賴條件中存在不存在的依賴條件,則會尋找其它規則是否可以產生依賴條件。
例如:規則一是生成目標 hello.out 需要使用到依賴條件 hello.o,但是 hello.o 不存在。則 Makefile 會尋找到一個生成 hello.o 的規則二并執行。
4. 命令
即通過執行該命令,由依賴文件生成目標文件。
注意每條命令前必須有且僅有一個 tab 保持縮進,這是語法要求。
5. ALL
Makefile 文件默認只生成第一個目標文件即完成編譯,但是我們可以通過 “ALL” 指定需要生成的目標文件。
6. 示例
針對以上所說的,先寫一個示例讓大家了解一下,首先準備一個 hello.c:
#include <stdio.h>int main() {printf("Hello World !\n");return 0; }然后寫一個 Makefile
ALL: hello.outhello.out: hello.cgcc hello.c -o hello.out編譯并執行:
$ make gcc hello.c -o hello.out $ ./hello.out Hello World !?
三、2個函數
1. wildcard
例如
SRC = $(wildcard ./*.c)匹配目錄下所有的 .c 文件,并將其賦值給 SRC 變量。
2. patsubst
pat 是 pattern 的縮寫,subst 是 substring 的縮寫。例如
OBJ = $(patsubst %.c, %.o, $(SRC))這個函數有三個參數,意思是取出 SRC 中所有的值,然后將 “.c” 替換為 “.o”,最后賦值給 OBJ 變量。
3. 示例
通過上面兩個函數,加入我們目錄下有很多個 “.c” 后綴的源文件,就不需要寫很多條規則語句了,而是可以像下面這樣寫
SRC = $(wildcard *.c) OBJ = $(patsubst %.c, %.o, $(SRC))ALL: hello.outhello.out: $(OBJ)gcc $(OBJ) -o hello.out$(OBJ): $(SRC)gcc -c $(SRC) -o $(OBJ)這里我們先將所有的 “.c” 文件編譯為 “.o” 文件,這樣后面更改某個 “.c” 文件時,其它的 “.c” 文件將不再編譯,而只是編譯有更改的 “.c” 文件,可以大大節約大項目中的編譯速度。
?
四、3個變量
Makefile 中也有一些已經定義好的常用變量,這里介紹其中常用的3個。
1. $@
表示規則中目標,例如 hello.out。
2. $<
表示規則中的第一個依賴條件,例如 hello.c
3. $^
表示規則中的所有依賴條件,由于我們示例中都只有一個依賴條件,這種情況下 $^ 和 $< 區別不大。
4. 示例
使用這些變量替換上面寫的 Makefile,即是:
SRC = $(wildcard *.c) OBJ = $(patsubst %.c, %.o, $(SRC))ALL: hello.outhello.out: $(OBJ)gcc $< -o $@$(OBJ): $(SRC)gcc -c $< -o $@?
五、其它常用功能
1. 代碼清理 clean
我們可以編譯一條屬于自己的 clean 語句,來清理 make 命令所產生的所有文件。例如
SRC = $(wildcard *.c) OBJ = $(patsubst %.c, %.o, $(SRC))ALL: hello.outhello.out: $(OBJ)gcc $< -o $@$(OBJ): $(SRC)gcc -c $< -o $@clean:-rm -rf $(OBJ) hello.out這樣我們就可以使用 clean 命令來清理生成的文件了:
$ ls hello.c hello.o hello.out Makefile $ make clean rm -rf hello.o hello.out $ ls hello.c Makefile?
2. 偽目標 .PHONY
上面我們寫了一個 clean 語句,使得我們執行 “make clean” 命令的時候,可以清理我們生成的文件。
但是假如還存在一個文件名就是 clean 文件,那么我們再執行 “make clean” 命令的時候就只是顯示
$ make clean make: `clean' is up to date.解決方法就是我們使用偽目標,這樣就可以避免出現上面的問題了,例如:
SRC = $(wildcard *.c) OBJ = $(patsubst %.c, %.o, $(SRC))ALL: hello.outhello.out: $(OBJ)gcc $< -o $@$(OBJ): $(SRC)gcc -c $< -o $@clean:-rm -rf $(OBJ) hello.out.PHONY: clean ALL通常,我們也會把 ALL 也設置為偽目標。?
?
總結
以上是生活随笔為你收集整理的Makefile 语法入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 行人重识别ReID
- 下一篇: 激光器发射光功率饱和值