python環(huán)境搭建Makefile簡(jiǎn)單使用步驟
Makefile 簡(jiǎn)單使用方法
Makefile 是自動(dòng)化構(gòu)建工具,核心作用是定義項(xiàng)目的構(gòu)建規(guī)則、依賴關(guān)系和執(zhí)行命令,通過 make 命令自動(dòng)執(zhí)行,替代手動(dòng)重復(fù)敲編譯/運(yùn)行/清理等指令,大幅提升開發(fā)效率,尤其適合C/C++項(xiàng)目,也可用于Python/Go等各類項(xiàng)目的自動(dòng)化流程管理。
一、Makefile 核心規(guī)則(最基礎(chǔ)、最核心)
Makefile 的核心是規(guī)則,一個(gè)規(guī)則對(duì)應(yīng)一個(gè)構(gòu)建目標(biāo),基本格式固定,命令行前必須用 Tab 鍵縮進(jìn)(空格會(huì)報(bào)錯(cuò),這是最常見的坑):
# 格式:目標(biāo): 依賴文件/依賴目標(biāo) # 執(zhí)行的命令(Tab 開頭,可多行) 目標(biāo)(target): 依賴(dependencies) 命令1(shell 命令均可,如gcc、rm、python等) 命令2
- 目標(biāo):要生成的文件(如可執(zhí)行文件、目標(biāo)文件)或「?jìng)文繕?biāo)」(如clean、run,無實(shí)際文件生成);
- 依賴:生成目標(biāo)所需的文件/其他目標(biāo)(如編譯可執(zhí)行文件需要的.c源文件);
- 命令:從依賴生成目標(biāo)的shell指令,按順序執(zhí)行。
二、最簡(jiǎn)入門示例(編譯單個(gè)C文件)
以編譯C文件 main.c 生成可執(zhí)行文件 app 為例,創(chuàng)建名為 Makefile(或 makefile,首字母大小寫均可)的文件,內(nèi)容如下:
# 最簡(jiǎn)Makefile:生成可執(zhí)行文件app app: main.c gcc main.c -o app # Tab 開頭,編譯命令 # 清理目標(biāo):刪除生成的可執(zhí)行文件 clean: rm -f app # -f 強(qiáng)制刪除,避免文件不存在時(shí)報(bào)錯(cuò)
執(zhí)行命令(終端在Makefile同級(jí)目錄)
make # 執(zhí)行第一個(gè)目標(biāo)(app),自動(dòng)編譯 make clean # 執(zhí)行clean目標(biāo),清理生成的文件
三、核心實(shí)用特性(簡(jiǎn)單易上手)
1. 偽目標(biāo)(.PHONY):避免與同名文件沖突
如果目錄下有個(gè)文件叫 clean,直接執(zhí)行 make clean 會(huì)失效,用 .PHONY 聲明「?jìng)文繕?biāo)」,表示這不是實(shí)際要生成的文件,強(qiáng)制執(zhí)行命令:
.PHONY: clean # 聲明clean為偽目標(biāo) app: main.c gcc main.c -o app clean: rm -f app
常用偽目標(biāo):all(構(gòu)建所有目標(biāo))、clean(清理)、run(運(yùn)行程序)、install(安裝)。
2. 變量:簡(jiǎn)化重復(fù)代碼,方便統(tǒng)一修改
定義變量后用 $(變量名) 引用,適合重復(fù)使用的內(nèi)容(如編譯器、編譯參數(shù)、源文件),修改一處即可全局生效:
.PHONY: clean run CC = gcc # 定義編譯器變量 CFLAGS = -Wall # 編譯參數(shù)(-Wall 顯示所有警告) TARGET = app # 可執(zhí)行文件名稱 SRC = main.c # 源文件 # 引用變量,簡(jiǎn)化規(guī)則 $(TARGET): $(SRC) $(CC) $(SRC) -o $(TARGET) $(CFLAGS) run: $(TARGET) # 運(yùn)行目標(biāo),依賴app(先編譯再運(yùn)行) ./$(TARGET) clean: rm -f $(TARGET)
執(zhí)行 make run,會(huì)自動(dòng)先編譯 app,再運(yùn)行 ./app。
3. 多目標(biāo)/多依賴:適配多個(gè)源文件的場(chǎng)景
如果項(xiàng)目有 main.c 和 func.c 兩個(gè)源文件,直接將多個(gè)依賴寫在目標(biāo)后即可:
.PHONY: clean CC = gcc TARGET = app # 多依賴:生成app需要main.c和func.c $(TARGET): main.c func.c $(CC) main.c func.c -o $(TARGET) clean: rm -f $(TARGET)
4. 默認(rèn)目標(biāo):Makefile 第一個(gè)目標(biāo)
make 命令不加任何參數(shù)時(shí),會(huì)自動(dòng)執(zhí)行第一個(gè)目標(biāo),通常用 all 作為第一個(gè)目標(biāo),指定要構(gòu)建的所有核心目標(biāo):
.PHONY: all clean run # all作為第一個(gè)目標(biāo),成為默認(rèn)目標(biāo) all: app # all依賴app,執(zhí)行make即執(zhí)行make all,編譯app CC = gcc TARGET = app SRC = main.c $(TARGET): $(SRC) $(CC) $(SRC) -o $(TARGET) run: $(TARGET) ./$(TARGET) clean: rm -f $(TARGET)
四、稍完整的實(shí)用示例(覆蓋核心用法)
整合變量、偽目標(biāo)、多依賴、運(yùn)行/清理,適合大部分小型項(xiàng)目:
# 聲明偽目標(biāo):all(默認(rèn))、clean(清理)、run(運(yùn)行) .PHONY: all clean run # 定義變量:編譯器、參數(shù)、目標(biāo)文件、所有源文件 CC = gcc CFLAGS = -Wall -g # -g 生成調(diào)試信息,方便gdb調(diào)試 TARGET = myapp # 所有源文件(多個(gè)用空格分隔) SRC = main.c func.c tool.c # 默認(rèn)目標(biāo):構(gòu)建可執(zhí)行文件 all: $(TARGET) # 構(gòu)建規(guī)則:多源文件編譯 $(TARGET): $(SRC) @echo "開始編譯..." # @echo 執(zhí)行時(shí)不顯示命令本身,只顯示輸出 $(CC) $(SRC) -o $(TARGET) $(CFLAGS) @echo "編譯完成!生成文件:$(TARGET)" # 運(yùn)行程序:先編譯再運(yùn)行 run: $(TARGET) @echo "運(yùn)行程序:" ./$(TARGET) # 清理生成的文件 clean: @echo "清理文件..." rm -f $(TARGET) @echo "清理完成"
執(zhí)行命令
make # 編譯(默認(rèn)執(zhí)行all) make run # 編譯+運(yùn)行 make clean # 清理
五、關(guān)鍵使用要點(diǎn)
- 命令行前必須用 Tab 縮進(jìn),不能用空格(編輯器需關(guān)閉「Tab自動(dòng)轉(zhuǎn)空格」);
- 注釋用
#開頭,單行注釋; - 執(zhí)行命令時(shí),加
@可隱藏命令本身(如@echo只顯示輸出,不顯示echo 開始編譯...); - Makefile 會(huì)自動(dòng)檢查依賴文件的修改時(shí)間:如果依賴文件(如.c)比目標(biāo)文件(如可執(zhí)行文件)新,才會(huì)重新編譯,否則跳過(節(jié)省構(gòu)建時(shí)間)。
六、核心總結(jié)
- Makefile 核心是規(guī)則(目標(biāo):依賴 + Tab命令),用于定義自動(dòng)化構(gòu)建流程;
- 必學(xué)特性:
Tab縮進(jìn)、偽目標(biāo)(.PHONY)、變量($(變量))、默認(rèn)目標(biāo)(第一個(gè)); - 常用命令:
make(執(zhí)行默認(rèn)目標(biāo))、make 目標(biāo)名(執(zhí)行指定目標(biāo),如make clean/run); - 核心價(jià)值:替代手動(dòng)重復(fù)指令,自動(dòng)檢查文件修改、按需構(gòu)建,適合所有需要重復(fù)執(zhí)行固定流程的項(xiàng)目。
到此這篇關(guān)于python環(huán)境搭建Makefile簡(jiǎn)單使用步驟的文章就介紹到這了,更多相關(guān)python makefile使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python寫了個(gè)疫情信息快速查看工具實(shí)例代碼
本次使用PyQt5開發(fā)了一款疫情信息快速查看工具,實(shí)現(xiàn)了多個(gè)數(shù)據(jù)源的查看,代碼量不大,功能相當(dāng)于瀏覽器,只是限定了一些特定網(wǎng)址,這篇文章主要介紹了Python寫了個(gè)疫情信息快速查看工具,需要的朋友可以參考下2022-11-11
使用Python從有道詞典網(wǎng)頁(yè)獲取單詞翻譯
這篇文章主要介紹了使用Python從有道詞典網(wǎng)頁(yè)獲取單詞翻譯的相關(guān)資料,需要的朋友可以參考下2016-07-07
Python TCP通信客戶端服務(wù)端代碼實(shí)例
這篇文章主要介紹了Python TCP通信客戶端服務(wù)端代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
python如何實(shí)現(xiàn)常用的五種排序算法詳解
排序有很多種實(shí)現(xiàn)方法,比如冒泡排序、選擇排序、歸并排序、希爾排序、快速排序、插入排序、堆排序、基數(shù)排序等,這篇文章主要給大家介紹了關(guān)于python如何實(shí)現(xiàn)常用的五種排序算法,需要的朋友可以參考下2021-08-08
Python實(shí)現(xiàn)SSH隧道功能的示例代碼
SSH隧道是利用SSH協(xié)議建立一個(gè)加密通道,以保護(hù)通過不安全網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù),本文將介紹如何使用Python來實(shí)現(xiàn)SSH隧道功能,感興趣的可以了解下2025-02-02
使用Python實(shí)現(xiàn)簡(jiǎn)單的微信控制操作
這篇文章主要為大家詳細(xì)介紹了如何通過Python去調(diào)用Windows API實(shí)現(xiàn)模擬人工操作的方式去實(shí)現(xiàn)控制微信電腦版,感興趣的小伙伴可以參考一下2025-01-01
Python自定義sorted排序?qū)崿F(xiàn)方法詳解
這篇文章主要介紹了Python自定義sorted排序?qū)崿F(xiàn)方法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
對(duì)pyqt5中QTabWidget的相關(guān)操作詳解
今天小編就為大家分享一篇對(duì)pyqt5中QTabWidget的相關(guān)操作詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-06-06

