C語言Makefile編寫與使用指南

Makefile 詳細指南:編寫與使用

Makefile 是 C/C++ 項目中常用的自動化構建工具,它定義了項目的編譯規則和依賴關系。下面我將詳細介紹 Makefile 的編寫和使用方法。

一、Makefile 基礎

1. 基本結構

一個典型的 Makefile 包含以下部分:

makefile

復制

下載

target: dependenciescommand
  • target:通常是生成的文件名,也可以是一個動作名稱(偽目標)

  • dependencies:生成 target 所需的文件或其它 target

  • command:需要執行的命令(必須以 Tab 開頭)

2. 簡單示例

makefile

復制

下載

hello: hello.cgcc hello.c -o hello

二、Makefile 核心語法

1. 變量定義與使用

makefile

復制

下載

CC = gcc
CFLAGS = -Wall -O2
TARGET = program$(TARGET): main.c utils.c$(CC) $(CFLAGS) main.c utils.c -o $(TARGET)

2. 自動變量

  • $@:當前目標名

  • $<:第一個依賴項

  • $^:所有依賴項

  • $?:比目標新的依賴項列表

makefile

復制

下載

program: main.o utils.o$(CC) $^ -o $@main.o: main.c$(CC) $(CFLAGS) -c $< -o $@utils.o: utils.c$(CC) $(CFLAGS) -c $< -o $@

3. 通配符與模式規則

makefile

復制

下載

# 匹配所有.c文件
SRCS = $(wildcard *.c)
OBJS = $(SRCS:.c=.o)%.o: %.c$(CC) $(CFLAGS) -c $< -o $@

4. 函數

常用函數:

  • $(wildcard pattern):文件列表

  • $(patsubst pattern,replacement,text):模式替換

  • $(shell command):執行 shell 命令

makefile

復制

下載

SRCS = $(wildcard src/*.c)
OBJS = $(patsubst src/%.c,obj/%.o,$(SRCS))

三、完整項目示例

makefile

復制

下載

# 編譯器設置
CC = gcc
CFLAGS = -Wall -Wextra -O2
LDFLAGS = -lm# 目錄設置
SRCDIR = src
OBJDIR = obj
BINDIR = bin# 文件設置
TARGET = $(BINDIR)/program
SRCS = $(wildcard $(SRCDIR)/*.c)
OBJS = $(patsubst $(SRCDIR)/%.c,$(OBJDIR)/%.o,$(SRCS))# 默認目標
all: $(TARGET)# 鏈接目標
$(TARGET): $(OBJS) | $(BINDIR)$(CC) $(LDFLAGS) $^ -o $@# 編譯規則
$(OBJDIR)/%.o: $(SRCDIR)/%.c | $(OBJDIR)$(CC) $(CFLAGS) -c $< -o $@# 創建目錄
$(BINDIR) $(OBJDIR):mkdir -p $@# 清理
clean:rm -rf $(OBJDIR) $(BINDIR)# 偽目標聲明
.PHONY: all clean

四、Makefile 使用

1. 基本命令

  • make:執行第一個目標(通常是 all)

  • make target:執行指定目標

  • make clean:執行清理操作

  • make -n:顯示但不執行命令(干跑)

  • make -j4:使用 4 個線程并行編譯

2. 常用選項

  • -B:強制重新編譯所有目標

  • -C dir:切換到指定目錄后執行

  • -f file:指定使用的 Makefile 文件

五、高級技巧

1. 條件判斷

makefile

復制

下載

ifeq ($(DEBUG),1)CFLAGS += -g -DDEBUG
elseCFLAGS += -O2
endif

2. 包含其他 Makefile

makefile

復制

下載

include config.mk

3. 自動依賴生成

makefile

復制

下載

DEPFLAGS = -MMD -MP
CFLAGS += $(DEPFLAGS)-include $(OBJS:.o=.d)

六、最佳實踐

  1. 使用變量存儲常用命令和參數

  2. 將中間文件與源文件分離

  3. 為每個子目錄創建單獨的 Makefile

  4. 使用?-include?包含依賴文件

  5. 聲明?.PHONY?目標

  6. 添加?help?目標說明用法

makefile

復制

下載

.PHONY: help
help:@echo "Usage: make [target]"@echo ""@echo "Targets:"@echo "  all     Build the program (default)"@echo "  clean   Remove generated files"@echo "  help    Show this help message"

通過以上內容,你應該能夠編寫和使用 Makefile 來管理 C 語言項目了。Makefile 的靈活性很高,可以根據項目需求進行調整和擴展。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/81107.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/81107.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/81107.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Centos離線安裝Docker(無坑版)

1、下載并上傳docker離線安裝包 官方地址&#xff1a;安裝包下載 2、上傳到離線安裝的服務器解壓 tar -zxvf docker-28.1.1.tgz#拷貝解壓二進制文件到相關目錄 cp docker/* /usr/bin/ 3、創建docker啟動文件 cat << EOF > /usr/lib/systemd/system/docker.servic…

OceanBase數據庫-學習筆記4-租戶

租戶 租戶偏向于資源層面的邏輯概念&#xff0c;是在物理節點上劃分的資源單元&#xff0c;可以指定其資源規格&#xff0c;包括 CPU、內存、日志盤空間、IOPS 等。 租戶類似于傳統數據庫的數據庫實例&#xff0c;租戶通過資源池與資源關聯&#xff0c;從而獨占一定的資源配額…

UNIAPP項目記錄

一、通過 vue-cli 創建 uni-app 項目 創建 vue3 項目 創建以 javascript 開發的工程&#xff08;如命令行創建失敗&#xff0c;請直接訪問 gitee 下載模板&#xff09; npx degit dcloudio/uni-preset-vue#vite my-vue3-project復制代碼 npx degit dcloudio/uni-preset-vue#vit…

華為發布全球首個L3商用智駕ADS4.0

2024年10月2024世界智能網聯汽車大會上&#xff0c;余承東講到&#xff1a;“華為ADS 4.0將于2025年推出高速L3級自動駕駛商用及城區L3級自動駕駛試點&#xff0c;希望加快L3級自動駕駛標準的進程&#xff0c;推動L3級自動駕駛技術的普及。” 世界智能網聯汽車大會演講PPT 所以…

【Python學習路線】零基礎到項目實戰

目錄 &#x1f31f; 前言技術背景與價值當前技術痛點解決方案概述目標讀者說明 &#x1f9e0; 一、技術原理剖析核心概念圖解核心作用講解關鍵技術模塊說明技術選型對比 &#x1f4bb; 二、實戰演示環境配置要求核心代碼實現運行結果驗證 ? 三、性能對比測試方法論量化數據對比…

解決redis序列號和反序列化問題

最近遇到了一個問題,將 List<Map<String, Object>> 類型數據以list形式存入到redis之后,發現取出來時數據格式完全不對,根據報錯信息發現是反序列化問題,遇到類似問題,主要有兩種解決方案1.使用序列號工具 例如&#xff0c;Java中常用的序列化工具有Jackson、Gso…

Android學習總結之設計場景題

設計圖片請求框架的緩存模塊 核心目標是通過分層緩存策略&#xff08;內存緩存 磁盤緩存&#xff09;提升圖片加載效率&#xff0c;同時兼顧內存占用和存儲性能。以下是針對 Android 面試官的回答思路&#xff0c;結合代碼注釋說明關鍵設計點&#xff1a; 一、緩存架構設計&…

Webug3.0通關筆記14 第十四關:存儲型XSS

目錄 第十四關:存儲型XSS 1.打開靶場 2.源碼分析 3.滲透實戰 第十四關:存儲型XSS 本文通過《webug3靶場第十四關 存儲型XSS》來進行存儲型XSS關卡的滲透實戰。 存儲型 XSS&#xff08;Stored Cross - Site Scripting&#xff09;&#xff0c;也被稱為持久型 XSS&#xff…

Java父類、子類實例初始化順序詳解

1、完整的初始化順序&#xff08;含繼承&#xff09; 1、父類的靜態初始化 父類靜態變量默認值 → 父類靜態變量顯式賦值 父類靜態代碼塊&#xff08;按代碼順序執行&#xff09;。 2、子類的靜態初始化 子類靜態變量默認值 → 子類靜態變量顯式賦值 子類靜態代碼塊&…

13.組合模式:思考與解讀

原文地址:組合模式&#xff1a;思考與解讀 更多內容請關注&#xff1a;7.深入思考與解讀設計模式 引言 在軟件開發中&#xff0c;是否曾經遇到過這樣一種情況&#xff1a;你有一個對象&#xff0c;它本身很簡單&#xff0c;但是它包含了其他類似的對象。隨著系統變得越來越復…

OpenCV實戰教程 第一部分:基礎入門

第一部分&#xff1a;基礎入門 1. OpenCV簡介 什么是OpenCV及其應用領域 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一個開源的計算機視覺和機器學習軟件庫&#xff0c;于1999年由Intel公司發起&#xff0c;現在由非營利組織OpenCV.org維護。Ope…

虛幻商城 Quixel 免費資產自動化入庫(2025年版)

文章目錄 一、背景二、問題講解1. Quixel 免費資產是否還能一鍵入庫?2. 是不是使用了一鍵入庫功能 Quixel 的所有資產就能入庫了?3. 一鍵入庫會入庫哪些資產?三、實現效果展示四、實現自動化入庫五、常見問題1. 出現401報錯2. 出現429報錯3. 入庫過于緩慢4. 入庫 0 個資產一…

uni-app - 小程序使用高德地圖完整版

文章目錄 ??功能描述??效果??開發環境??代碼部分??功能描述 頁面自動通過定位獲取用戶位置并展示周邊POI數據,同時支持關鍵詞輸入實時聯想推薦關聯地點信息, 實現精準智能的地點發現與檢索功能。 ??效果 ??開發環境 unibest2.5.4nodev18.20.5pnpm9.14.2wot-des…

牛客:AB4 逆波蘭表達式求值

鏈接&#xff1a;逆波蘭表達式求值_牛客題霸_牛客網 題解&#xff1a; 利用棧&#xff0c;遍歷字符串數組&#xff0c;遇到運算數則入棧&#xff0c;遇到運算符則取出棧頂兩個運算數進行運算&#xff0c;并將運算結果入棧。 class Solution { public:/*** 代碼中的類名、方法…

Ant(Ubuntu 18.04.6 LTS)安裝筆記

一、前言 本文與【MySQL 8&#xff08;Ubuntu 18.04.6 LTS&#xff09;安裝筆記】同批次&#xff1a;先搭建數據庫&#xff0c;再安裝JDK&#xff0c;后面肯定就是部署Web應用。其中Web應用的部署使用 Ant 方式&#xff0c;善始善終&#xff0c;特以筆記。 二、準備 &#xf…

ultralytics 目標檢測 混淆矩陣 背景圖像 沒被記錄

修改 utils/metrics.py ConfusionMatrix def process_batch(self, detections, gt_bboxes, gt_cls):"""Update confusion matrix for object detection task.Args:detections (Array[N, 6] | Array[N, 7]): Detected bounding boxes and their associated inf…

iview 如何設置sider寬度

iview layout組件中&#xff0c;sider設置了默認寬度和最大寬度&#xff0c;在css樣式文件中修改無效&#xff0c;原因是iview默認樣式設置在了element.style中&#xff0c;只能通過行內樣式修改 樣式如下&#xff1a; image.png image.png 修改方式&#xff1a; 1.官方文檔中寫…

go-zero(十七)結合DTM :實現分布式事務

1. 基礎概念介紹 1.1 什么是分布式事務 在微服務架構中&#xff0c;一個業務操作常常需要調用多個服務來完成。例如&#xff0c;在電商系統中下單時&#xff0c;需要同時操作訂單服務和庫存服務。這種跨服務的操作就需要分布式事務來保證數據一致性。 分布式事務面臨以下挑戰…

2025 簡易Scrum指南(簡體中文版)

Scrum是一個輕量級的、以團隊為中心的框架&#xff0c;用于解決復雜的問題并創造價值。Scrum有意保持非完整性&#xff0c;Scrum的設計初衷旨在依靠使用者的集體智慧來不斷演進構建。 Scrum建立在實驗主義和精益思想的基礎上&#xff0c;它賦能團隊靈活巧妙地工作&#xff0c;…

2025最新福昕PDF編輯器,PDF萬能處理工具

軟件介紹 Foxit PDF Editor Pro 2025 中文特別版&#xff08;以前稱為 Foxit PhantomPDF Business&#xff09;是一款專為滿足各種辦公需求而設計的業務就緒的PDF工具包。 軟件特點 1. 強大的PDF編輯能力 創建新文檔&#xff1a;用戶可以從無到有地構建PDF文檔&#xff0c;添…