最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

自動(dòng)化構(gòu)建工具make與Makefile用法示例詳解

 更新時(shí)間:2026年05月03日 11:14:29   作者:鳳年徐  
make是一個(gè)命令工具,是一個(gè)解釋makefile在指令的命令工具,大多數(shù)的IDE都存在這個(gè)命令, makefile成為一種在工程方面的編譯方法,這篇文章主要介紹了自動(dòng)化構(gòu)建工具make與Makefile用法的相關(guān)資料,需要的朋友可以參考下

1. 什么是 make / Makefile?

make 是一個(gè)自動(dòng)化構(gòu)建工具,它根據(jù)一個(gè)叫做 Makefile 的文件中的規(guī)則,自動(dòng)編譯和鏈接程序。更本質(zhì)一點(diǎn)說,make是一個(gè)命令,makefile是一個(gè)文件。
Makefile 定義了文件之間的依賴關(guān)系以及如何生成目標(biāo)文件。

注意:Makefile 文件名首字母可以大寫也可以小寫,但通常使用 Makefilemakefile。

2. Makefile 的基本結(jié)構(gòu)

依賴關(guān)系與依賴方法

一個(gè)典型的規(guī)則如下:

target: dependencies
    recipe
  • 第一行target 是要生成的目標(biāo)文件,dependencies 是生成該目標(biāo)所依賴的文件。
  • 第二行recipe 是生成目標(biāo)的命令(必須以 Tab 鍵開頭)。

示例:

myproc:myproc.c
    gcc -o myproc myproc.c

  • myproc 是目標(biāo)文件,依賴 myproc.c。
  • 依賴方法:gcc -o myproc myproc.c。

make 的執(zhí)行規(guī)則

  • make 命令默認(rèn)掃描當(dāng)前目錄下的 Makefile,并執(zhí)行 第一個(gè) 目標(biāo)。
  • 如果依賴文件的時(shí)間戳比目標(biāo)文件新(即內(nèi)容被修改過),則重新生成目標(biāo);否則跳過。
  • 這樣設(shè)計(jì)可以避免重復(fù)編譯未修改的代碼,提高構(gòu)建效率。

3. 如何判斷文件是否被修改?

之前說過,文件=內(nèi)容+屬性

文件的三個(gè)時(shí)間戳(stat 命令)

在 Linux 中,每個(gè)文件都有三個(gè)時(shí)間戳:

時(shí)間戳含義
Access最近一次訪問時(shí)間(讀文件)
Modify最近一次內(nèi)容修改時(shí)間
Change最近一次屬性修改時(shí)間

注意:

  • 修改文件內(nèi)容時(shí),Modify 和 Change 都會(huì)更新(因?yàn)槲募笮〉葘傩宰兞耍?/li>
  • 單獨(dú)修改屬性(如 chmod)只會(huì)更新 Change。
  • Access 時(shí)間不會(huì)每次都更新(為了減少磁盤 I/O),通常訪問多次后才刷新一次。

make 的判斷依據(jù)

make 只根據(jù) Modify 時(shí)間來判斷文件內(nèi)容是否發(fā)生了更改。

如果依賴文件的 Modify 時(shí)間晚于目標(biāo)文件,則重新生成。

使用 touch 修改時(shí)間

touch 命令除了可以創(chuàng)建空文件,還可以將所有時(shí)間戳更新為當(dāng)前時(shí)間:

touch filename   # 將 filename 的 Access、Modify、Change 都改為當(dāng)前時(shí)間

利用這個(gè)特性,可以強(qiáng)制讓 make 認(rèn)為文件被修改過,從而總是執(zhí)行某個(gè)目標(biāo)。

touch可以統(tǒng)一更改時(shí)間到當(dāng)前時(shí)刻

為什么講這些呢?

因?yàn)檫@些是關(guān)鍵字PHONY的原理

PHONY可以使程序可以總是被執(zhí)行,下圖中的clean就是如此,原理就是通過touch修改時(shí)間

所以我們使用make clean的時(shí)候可以總是被執(zhí)行

如果改成下圖這樣,make也可以總是被執(zhí)行,但為了節(jié)省編譯時(shí)間,通常不會(huì)這樣做

4. 偽目標(biāo)(.PHONY)

為什么需要偽目標(biāo)?

有時(shí)候我們想執(zhí)行一些不生成具體文件的操作(例如 clean 刪除中間文件)。但 clean 本身不是一個(gè)真實(shí)的文件,如果恰好當(dāng)前目錄下有一個(gè)名為 clean 的文件,make clean 就會(huì)認(rèn)為目標(biāo)已經(jīng)存在且無依賴,從而跳過執(zhí)行。

使用 .PHONY 聲明偽目標(biāo)

.PHONY: clean
clean:
    rm -f *.o hello
  • .PHONY 告訴 make:clean 不是一個(gè)真實(shí)文件,無論是否存在,都執(zhí)行它的命令。
  • 偽目標(biāo)的原理本質(zhì)上是 make 強(qiáng)制把它的依賴時(shí)間視為“總是比目標(biāo)新”,從而總是執(zhí)行。

能否讓普通目標(biāo)也總是執(zhí)行?

可以,但不推薦。例如:

hello: hello.c
    gcc hello.c -o hello
    touch hello   # 更新 hello 的時(shí)間戳,這樣下次 make 時(shí)會(huì)認(rèn)為 hello 比依賴新,從而不編譯

這樣會(huì)導(dǎo)致每次 make 都重新編譯,失去了增量編譯的優(yōu)勢(shì)。因此,一般只對(duì) clean 等輔助目標(biāo)使用 .PHONY

5. Makefile 的推導(dǎo)規(guī)則(自動(dòng)推導(dǎo))

拆分寫法(不常用,僅用于理解)

上述的命令可以拆分成下圖(一般不這樣寫,為了講解原理而拆分)

makefile會(huì)從上向下掃描,沒有就入棧,有就出棧執(zhí)行

在實(shí)際開發(fā)中,我們一般這樣寫

其中$(BIN) 和 (SRC)替換成(SRC) 替換成(SRC)替換成@和$^

  • $@ 表示目標(biāo)文件。
  • $^ 表示所有依賴文件。

如果不想回顯命令,可以在前邊加上@

如果想看起來直觀一點(diǎn),可以在命令后輸出一行,指定內(nèi)容

make 會(huì)從上向下掃描,發(fā)現(xiàn)需要 hello.o,則先去執(zhí)行生成 hello.o 的規(guī)則,再返回執(zhí)行 hello 的規(guī)則。

簡化寫法(常用)

實(shí)際開發(fā)中,我們通常會(huì)使用變量和自動(dòng)化變量來簡化:

BIN = hello
SRC = hello.c

$(BIN): $(SRC)
    gcc -o $@ $^

隱藏命令回顯

在命令前加 @ 可以阻止 make 輸出該命令本身:

$(BIN): $(SRC)
    @gcc $^ -o $@
    @echo "編譯完成"

處理多個(gè)源文件

  • %.o: %.c 是一個(gè)模式規(guī)則,表示所有 .o 文件都依賴對(duì)應(yīng)的 .c 文件。
  • $< 表示第一個(gè)依賴文件(即對(duì)應(yīng)的 .c 文件)。

6. Makefile 的終極形態(tài)(通用模板)

說明:

  • wildcard 函數(shù):展開當(dāng)前目錄下所有 .c 文件。
  • SRC:.c=.o 是變量替換語法,將所有 .c 后綴替換為 .o。
  • 這個(gè)模板可以自動(dòng)適應(yīng)任意數(shù)量的 .c 文件,無需手動(dòng)列出。

SRC=$(shell ls *.c)
SRC=$(wildcard *.c) #兩種方式都可以 顯示當(dāng)前目錄下的所有.c文件
OBJ=$(SRC:.c=.o) #把所有SRC內(nèi)部的.c文件替換成.o文件

總結(jié)

概念說明
依賴關(guān)系目標(biāo)文件依賴哪些源文件或中間文件
依賴方法生成目標(biāo)的具體命令,前面必須有一個(gè) Tab
時(shí)間戳make 根據(jù)文件的 Modify 時(shí)間判斷是否需要重新編譯
偽目標(biāo).PHONY 聲明,總是執(zhí)行其命令(如 clean
自動(dòng)化變量$@(目標(biāo))、$^(所有依賴)、$<(第一個(gè)依賴)
模式規(guī)則%.o: %.c 表示所有 .o 依賴同名 .c
函數(shù)wildcard、shell 等用于動(dòng)態(tài)獲取文件列表

掌握這些內(nèi)容,你就可以編寫靈活、高效的 Makefile,實(shí)現(xiàn)項(xiàng)目的自動(dòng)化構(gòu)建。

新編譯 |
| 偽目標(biāo) | 用 .PHONY 聲明,總是執(zhí)行其命令(如 clean) |
| 自動(dòng)化變量 | $@(目標(biāo))、$^(所有依賴)、$<(第一個(gè)依賴) |
| 模式規(guī)則 | %.o: %.c 表示所有 .o 依賴同名 .c |
| 函數(shù) | wildcard、shell 等用于動(dòng)態(tài)獲取文件列表 |

掌握這些內(nèi)容,你就可以編寫靈活、高效的 Makefile,實(shí)現(xiàn)項(xiàng)目的自動(dòng)化構(gòu)建。

到此這篇關(guān)于自動(dòng)化構(gòu)建工具make與Makefile用法示例詳解的文章就介紹到這了,更多相關(guān)自動(dòng)化構(gòu)建工具make與Makefile內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • shell?循環(huán)命令詳解

    shell?循環(huán)命令詳解

    這篇文章給大家介紹了shell?循環(huán)命令的相關(guān)知識(shí),包括for命令使用,c?風(fēng)格?for?命令及while?命令等等,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2022-10-10
  • shell 進(jìn)度條實(shí)現(xiàn)代碼

    shell 進(jìn)度條實(shí)現(xiàn)代碼

    shell實(shí)現(xiàn)的一個(gè)進(jìn)度條,感興趣的朋友不妨看看
    2013-02-02
  • Python執(zhí)行Linux系統(tǒng)命令的4種方法

    Python執(zhí)行Linux系統(tǒng)命令的4種方法

    這篇文章主要介紹了Python執(zhí)行Linux系統(tǒng)命令的4種方法,即在Python腳本中調(diào)用Shell命令,需要的朋友可以參考下
    2014-10-10
  • ubuntu中root和普通用戶切換方法(推薦)

    ubuntu中root和普通用戶切換方法(推薦)

    下面小編就為大家?guī)硪黄猽buntu中root和普通用戶切換方法(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • Shell腳本中條件判斷的原理與使用教學(xué)

    Shell腳本中條件判斷的原理與使用教學(xué)

    這篇文章主要為大家詳細(xì)介紹了Shell編程中的條件判斷和流程控制,包括條件測(cè)試、if語句、模式匹配等內(nèi)容,文中的示例代碼講解詳細(xì),希望對(duì)大家有所幫助
    2026-04-04
  • linux shell的輸出效果修改方法(界面顏色)

    linux shell的輸出效果修改方法(界面顏色)

    文本終端的顏色可以使用“ANSI非常規(guī)字符序列”來生成,有時(shí)候想個(gè)性化輸出,就可以參考下面的方法
    2013-01-01
  • git多賬號(hào)登錄問題解析

    git多賬號(hào)登錄問題解析

    這篇文章主要介紹了git多賬號(hào)登錄問題解析及git多個(gè)賬戶沖突問題的解決辦法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-07-07
  • Shell腳本配合iptables屏蔽來自某個(gè)國家的IP訪問

    Shell腳本配合iptables屏蔽來自某個(gè)國家的IP訪問

    這篇文章主要介紹了Shell腳本配合iptables屏蔽來自某個(gè)國家的IP訪問,本文利用IPdeny的IP數(shù)據(jù),然后用Shell腳本導(dǎo)入iptables實(shí)現(xiàn)屏蔽IP訪問,需要的朋友可以參考下
    2015-04-04
  • 詳解shell 變量

    詳解shell 變量

    這篇文章主要介紹了shell 變量的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)shell,感興趣的朋友可以了解下
    2020-08-08
  • Linux Shell腳本實(shí)現(xiàn)檢測(cè)tomcat

    Linux Shell腳本實(shí)現(xiàn)檢測(cè)tomcat

    這篇文章主要介紹了Linux Shell腳本實(shí)現(xiàn)檢測(cè)tomcat的方法,推薦給小伙伴們,需要的朋友可以參考下
    2015-03-03

最新評(píng)論

时尚| 莱西市| 平陆县| 芮城县| 建宁县| 许昌市| 湘潭县| 合山市| 东乌| 盱眙县| 新巴尔虎左旗| 娄底市| 连州市| 巫溪县| 咸宁市| 丰城市| 清河县| 马龙县| 孝昌县| 昌平区| 合山市| 北宁市| 那坡县| 汾阳市| 三穗县| 庐江县| 化州市| 库伦旗| 扶沟县| 盈江县| 虹口区| 太康县| 长寿区| 思南县| 元阳县| 东乌珠穆沁旗| 石家庄市| 天全县| 汤原县| 密云县| 波密县|