日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Makefile 语法入门

發布時間:2023/12/8 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 语法入门的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。