項目集成過程中的makefile記錄

項目集成過程中的makefile記錄

文章目錄

  • 項目集成過程中的makefile記錄
    • 1.基礎概念
      • 注釋
      • 打印
      • 賦值方式
      • 常用變量
        • @
        • $
      • 偽目標
      • 函數
        • wildcard
      • 多目錄、文件操作
    • 2.思路梳理
      • **需求分析**
      • 目錄結構
    • 3.可行示例

持續更新中

1.基礎概念

注釋

#

示例:

# 項目名稱

打印

 @echo "Hello, world!			#僅打印信息echo "Hello, world!			#打印命令和信息

賦值方式

=

使用 = 進行賦值時,變量的值是延遲展開的,即在使用變量時才進行展開計算。這意味著變量的值可以依賴于其他變量,也可能受后續賦值操作的影響。例如:SOURCES = $(wildcard src/*.c)
OBJS = $(SOURCES:.c=.o)

:=

:= 是 Makefile 中用于靜態變量賦值的一種方式,它具有立即展開和避免遞歸展開的特點,適合用于定義不依賴于其他變量的靜態值。

?=

使用 ?= 進行賦值時,如果變量之前未被賦過值(即為空),則進行賦值;如果變量已經有值,則不重新賦值。這種方式通常用于設置默認值,讓用戶可以在命令行或其他地方覆蓋默認值。例如:CC ?= gcc

+=

使用 += 可以向變量追加新的值,而不是覆蓋原有的值。這在需要動態追加值的情況下非常有用。例如:CFLAGS += -Wall -O2

常用變量

@

作用:

@ 符號通常用于控制命令的輸出

示例和講解:

print_message:@echo "Hello, world!
執行 make print_message 將只輸出 Hello, world!,而不會額外顯示命令本身。如果不帶 @ 符號,Make 工具將會輸出命令本身以及命令執行結果。print_message:echo "Hello, world!"
執行 make print_message 將輸出 echo "Hello, world!" 以及 Hello, world!。總之,@ 符號可以控制命令的輸出,讓你可以選擇是顯示命令本身還是只顯示命令執行結果。
$
1.變量引用:$ 后面跟著變量名可以引用該變量的值。
例如:$(CC)、$(CFLAGS)
例如:$(CC) -o output $(OBJS) 將會使用 CC 和 OBJS 的值來構建編譯命令。
2.命令替換:$() 或 ${} 用于執行命令替換,將命令的輸出結果賦給變量。例如:$(shell date '+%Y-%m-%d') 將會獲取當前日期并賦給變量。
3.特殊內建變量:$@ 表示規則中的目標文件名。
$^ 表示所有的依賴文件列表。
$< 表示規則中的第一個依賴文件名。
例如:$(CC) -o $@ $^ 表示將所有的依賴文件編譯鏈接生成目標文件。

偽目標

網上的一些介紹,可以增加理解:避免與同名文件沖突:有時候,當前目錄中可能會存在與 Makefile 中定義的目標同名的文件,如果這些目標不是偽目標,那么 Make 命令會誤以為這是一個文件依賴關系,從而導致錯誤。通過使用偽目標,可以避免這種沖突。明確指示任務:通過使用偽目標,你可以在 Makefile 中明確地定義一些任務,比如默認編譯任務、清理任務等,使得其他人閱讀代碼時更容易理解 Makefile 的意圖。確保每次執行:由于偽目標并不對應真實文件,因此無論是否存在同名文件,Make 命令都會執行偽目標定義的任務,這樣可以確保每次執行都能按照預期執行相應的命令。但記住下面這個就可以了:
當執行 make 命令時,Make 工具會按照規則執行 all 或 clean 相應的命令,而不會考慮是否存在同名文件

示例:

# 默認目標
all: $(TARGET)# 清理規則
clean:rm -rf $(BUILD_DIR) $(BIN_DIR).PHONY: all clean

函數

wildcard

原型:

$(wildcard pattern)pattern 是一個文件名模式,可以包含通配符 * 和 ?。wildcard 函數會將滿足模式的文件列表返回給調用者。

作用:

用于匹配文件名模式并返回匹配的文件列表

示例:

假設當前目錄下有以下文件:
src/main.c
src/util.c
include/header.h
我們可以使用 wildcard 函數來匹配以 .c 結尾的所有源文件:
SRC_FILES := $(wildcard src/*.c)
這將返回 src/main.c 和 src/util.c,并將其賦給 SRC_FILES 變量。wildcard 函數在 Makefile 中常用于收集源文件列表、頭文件列表等,以便在后續的編譯或構建過程中使用。

多目錄、文件操作

不同makefile文件相互調用

# 主Makefile文件sub_mk := ./src//ctrl/sub_ctrl.mk# 默認目標
all: @echo "building ..."@$(MAKE) -f $(sub_mk)
# 子Makefile文件.PHONY: SUB_CTRLSUB_CTRL:@echo "SUB_CTRL makefile test !!"

現象:

building ...
make[1]: 進入目錄“/home/psd/code_space/my_project_space/user_space/test/camera_usb/test”
SUB_CTRL makefile test !!
make[1]: 離開目錄“/home/psd/code_space/my_project_space/user_space/test/camera_usb/test”

2.思路梳理

需求分析

項目初期: 建立測試目錄進行模塊化的基礎功能使能那對于makefile的需求:1.對涉及到的.c源文件進行編譯;2.將編譯生成的中間文件以及目標文件存放到相應的目錄里面3.頂層目錄下執行make即可實現整個項目的編譯作用4.make clean 可以清除中間文件和已生成的目標文件其他拓展需求:1.

目錄結構

后續測試模塊內容寫完直接使用tree命令補充:# 源文件目錄
SRC_DIR := src# 頭文件目錄
INC_DIR := include# 目標文件目錄
BUILD_DIR := build# 可執行文件輸出目錄
BIN_DIR := bin# 源文件
SRCS := $(wildcard $(SRC_DIR)/**/*.c)# 目標文件
OBJS := $(SRCS:$(SRC_DIR)/%.c=$(BUILD_DIR)/%.o)# 可執行文件
TARGET := $(BIN_DIR)/$(PROJECT_NAME)

3.可行示例

# 項目名稱
PROJECT_NAME := USB_CAMERA# 編譯器
CC := gcc# 編譯選項
CFLAGS := -Wall -Wextra -g# 源文件目錄
SRC_DIR := src# 頭文件目錄
INC_DIR := include# 目標文件目錄
BUILD_DIR := build# 可執行文件輸出目錄
BIN_DIR := bin# 源文件
SRCS := $(wildcard $(SRC_DIR)/**/*.c)# 目標文件
OBJS := $(SRCS:$(SRC_DIR)/%.c=$(BUILD_DIR)/%.o)# 可執行文件
TARGET := $(BIN_DIR)/$(PROJECT_NAME)# 默認目標
all: $(TARGET)# 編譯目標
$(TARGET): $(OBJS) | $(BIN_DIR)$(CC) $(CFLAGS) $^ -o $@# 編譯規則
# 生成目標文件的規則
$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c
#創建目錄(如果不存在)@mkdir -p $(dir $@)$(CC) $(CFLAGS) -c $< -o $@# 創建目錄
$(BUILD_DIR):mkdir -p $@$(BIN_DIR):mkdir -p $@# 清理規則
clean:rm -rf $(BUILD_DIR) $(BIN_DIR).PHONY: all clean

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

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

相關文章

控制臺相關

輸入輸出 輸出 Console.WriteLine("123123");//光標空行 Console.Write("123123123123");//不空行輸入 string str Console.ReadLine(); //如果在ReadKey(true)不會把輸入的內容顯示在控制臺上 char c Console.ReadKey(true).KeyChar; Console.WriteL…

ACM實訓第25天

第四套 第一道&#xff08;修改&#xff09; #include<stdio.h> #include<string.h> int cnt[10]; void count_digits(int n,int* cnt){for(int i1;i<n;i){int numi;while(num){cnt[num%10];num/10;}} } int main(){int t;scanf("%d\n",&t);whi…

力扣刷題--2553. 分割數組中數字的數位【簡單】

題目描述 給你一個正整數數組 nums &#xff0c;請你返回一個數組 answer &#xff0c;你需要將 nums 中每個整數進行數位分割后&#xff0c;按照 nums 中出現的 相同順序 放入答案數組中。 對一個整數進行數位分割&#xff0c;指的是將整數各個數位按原本出現的順序排列成數…

名為投資實為借貸,如何處理

投資近百萬參與號稱“高回報、零風險”的內部商鋪投資項目&#xff0c;與公司簽訂商鋪投資合同及租賃合同。本想投資商鋪收取租金&#xff0c;沒想到不僅租金沒拿到手&#xff0c;連本金都要不回來。 2019年底&#xff0c;原告何某&#xff08;乙方&#xff09;與被告祁東縣某…

QSettings注冊表 json雙模式配置文件

qt QSettings 類可用來保存軟件設置&#xff0c;json文件也是保存軟件設置的很好的方式&#xff0e; 這里結合json文件和QSettings注冊表來保存軟件設置&#xff0e;區別在于json文件在軟件目錄&#xff0c;每次更新時會被覆蓋&#xff0c;注冊表中設置持久有效&#xff0c;…

14.FreeRTOS 消息緩存 Message Buffer

FreeRTOS 消息緩存&#xff08;Message Buffer&#xff09;的使用 介紹 在實時操作系統&#xff08;RTOS&#xff09;中&#xff0c;任務之間的通信是一個非常重要的方面。FreeRTOS 提供了多種機制來實現任務間通信&#xff0c;其中之一就是消息緩存&#xff08;Message Buffe…

【IC驗證】一文速通多通道數據整型器(MCDF)

目錄 01 README 02 MCDF設計結構 2.1 功能描述 2.2 設計結構 2.3 接口與時序 2.3.1 系統信號接口 2.3.2 通道從端接口 2.3.3 整形器接口 2.3.4 控制寄存器接口 2.3.4.1 接口時序圖 2.3.4.2 各數據位信息 03 驗證框圖 3.1 reg_pkg 3.1.1 reg_trans 3.1.2 reg_driv…

【一刷《劍指Offer》】面試題 27:二叉搜索樹與雙向鏈表

牛客對應題目鏈接&#xff1a;二叉搜索樹與雙向鏈表_牛客題霸_牛客網 (nowcoder.com) 力扣對應題目鏈接&#xff1a;LCR 155. 將二叉搜索樹轉化為排序的雙向鏈表 - 力扣&#xff08;LeetCode&#xff09; 一、《劍指 Offer》對應內容 二、分析題目 上面力扣上的這道題目和牛客…

AGM DAP-LINK 離線燒錄報錯信息分析

DAP-LINK 支持離線燒錄。 即&#xff1a;先把要燒錄的bin 燒錄到DAP-LINK 中&#xff1b;然后DAP-LINK 可以脫離PC&#xff0c;上電后通過按鍵對目標板進行燒錄。 CMSIS-DAP模式 跳線JGND斷開&#xff0c;狀態LED D4快閃&#xff0c;D3常亮&#xff08;串口狀態&#xff09;。…

deepin開發web前端:探索、挑戰與無限可能

deepin開發web前端&#xff1a;探索、挑戰與無限可能 在數字化浪潮洶涌的時代&#xff0c;Web前端作為連接用戶與數字世界的橋梁&#xff0c;其重要性日益凸顯。而deepin作為一款優秀的開源操作系統&#xff0c;為Web前端開發者提供了廣闊的舞臺。本文將圍繞deepin開發Web前端…

接口設計的最佳實踐-下篇

大多數程序員&#xff0c;做得最多的事&#xff0c;也不過是寫接口這件事而已。 今天繼續總結下接口設計需要注意的點。盡量每種都給出具體的場景、案例等&#xff0c;希望大家能有所收獲。 1、接口冪等 冪等性&#xff1a;是指一個操作或者一個服務&#xff0c;無論執行多少…

小程序怎樣進行本地存儲的讀、寫、刪、清?

小程序進行本地存儲的讀、寫、刪、清操作&#xff0c;可以通過微信小程序提供的API來實現。這些API分為同步和異步兩種類型&#xff0c;以滿足不同的使用場景和需求。 同步操作 同步操作會阻塞后續的代碼執行&#xff0c;直到操作完成。 寫入本地緩存&#xff08;寫&#xf…

Vue3 - Mac系統用文本編輯寫html不顯示效果的坑

平時在win系統下&#xff0c;可以直接對文本進行編輯&#xff0c;非常的舒服。 在mac系統中&#xff0c;也有類似的功能&#xff0c;就是文本編輯&#xff0c;沒想到居然還有坑。 這是我mac系統中創建的html文件&#xff0c;想著沒有幾行代碼&#xff0c;就沒有開編輯器了&am…

C語言 | Leetcode C語言題解之第125題驗證回文串

題目&#xff1a; 題解&#xff1a; bool isalumn(char c) {return (c > a && c < z) || (c > A && c < Z) || (c > 0 && c < 9); }bool isPalindrome(char* s) {for (int left 0, right strlen(s) - 1; left < right; left, …

【數據庫系統概論】事務

概述 在數據庫系統中&#xff0c;事務&#xff08;Transaction&#xff09;是指一組作為單個邏輯工作單元執行的操作。這些操作要么全部成功&#xff08;提交&#xff09;&#xff0c;要么全部失敗&#xff08;回滾&#xff09;。事務的主要目的是確保數據庫的完整性和一致性&…

AI與NLP的完美結合:揭秘ChatGPT

AI與NLP的完美結合&#xff1a;揭秘ChatGPT 一、AI大模型的發展歷程 AI大模型的發展可追溯到早期的深度學習技術。深度學習通過多層神經網絡處理復雜的數據模式&#xff0c;顯著提升了圖像識別、語音識別等領域的性能。隨后&#xff0c;研究人員將注意力轉向NLP&#xff0c;開…

【傳知代碼】多視圖3D目標檢測位置嵌入變換(論文復現)

前言&#xff1a;三維目標檢測技術正逐漸成為計算機視覺領域的重要研究方向。特別是在自動駕駛、增強現實&#xff08;AR&#xff09;、虛擬現實&#xff08;VR&#xff09;以及機器人導航等應用中&#xff0c;對三維空間內目標的精準檢測與定位顯得尤為重要。然而&#xff0c;…

人臉解鎖優化關鍵過程

一.人臉解鎖的關鍵過程 1. 按下power鍵 2. 屏幕點亮 3. 打開前攝 4. 獲取第一幀并傳給算法 5. 算法完成并返回結果 6. 解鎖完成并關閉相機 二. 相機優化點 1. 定制人臉解鎖自己的pipeline,去掉不必要的node,理論上只需要一個preview的pipeline 2. 使用AE warm up&#xff0c;減…

SAP_SD模塊-銷售交貨并開票后發現物料沒維護價格的完整處理方法(含POD功能)

銷售流程完結后&#xff0c;發現物料價格沒維護時&#xff0c;如何處理 一、業務背景&#xff1a; 1、問題發現時間&#xff1a;2024年6月2日&#xff1b; 2、問題描述&#xff1a; 2024年5月份的單據業務存在交貨成本和開票成本為0的單據&#x…

【JavaScript腳本宇宙】揭秘HTTP請求庫:深入理解它們的特性與應用

深度揭秘&#xff1a;六大HTTP請求庫的比較與應用 前言 在這篇文章中&#xff0c;我們將探討六種主要的HTTP請求庫。這些庫為處理網絡請求提供了不同的工具和功能&#xff0c;包括Axios、Fetch API、Request、SuperAgent、Got和Node-fetch。通過本文&#xff0c;你將對每個庫…