makefile基礎和工作常用點補充
一、Makefile簡介
定義編譯規則、自動化編譯、提高效率組織檔案
Makefile由一組規則(Rule)組成,每條規則的格式是:
例如:
依賴關係如下圖:
注意:
(1) 當我們為了執行命令而非建立目標檔案時,就會使用偽目標比如 clean,偽目標總是被執行。".PHONY" 的作用是避免和當前
目錄下的檔名衝突 (可能引發隱式規則)。
(2) 使用 "-" 字首可以忽略命令錯誤,比如建立已有的路徑; “@” 可以不顯示命令本身
(3) Makefile 中 $、# 有特殊含義,可以進行轉義 "\#"、"$$"。
(4) 可以使用 \ 換行 (註釋行也可以使用),但其後不能有空格,新行同樣必須以 Tab 開頭和縮排。
(5) 在工作目錄按 "GNUmakefile、makefile、Makefile (推薦)" 順序查詢執行,或 -f 指定。
(6) 如果不在 make 命令列顯式指定目標規則名,則預設使用第一個有效規則。
(7) 每條命令都在一個獨立 shell 環境中執行,如希望在同一 shell 執行,可以用 ";" 將命令寫在一行,也可用\ 換行。
(8) 在makefile 常見的gcc/g++引數 -D 即條件編譯; -static 使用靜態庫;注意 -L../lib -ldown 與 ../lib/libdown.so 等同
二、Makefile基本使用
make規則
沒被編譯過,則編譯;只編譯修改過的檔案
標頭檔案被改變,只編譯包含該標頭檔案的檔案
常用選項 : -C dir -f fileName -n 顯示待執行的命令,但不執行
Makefile組成
顯式規則:生成、依賴檔案,生成命令
隱含規則:make支援的自動推導功能, make –p 列印
變數定義:類C中巨集作用(?= := +=)。 引用方式 $(var) 或 ${var}。
"=" 遞迴展開變數,僅在目標展開時才會替換,也就是說它可以引用在後面定義的變數。
":=" 直接展開變數,在定義時就直接展開,它無法後置引用。
"?=" 表示變數為空或未定義時才進行賦值操作。
"+=" 追加賦值,也是遞迴展開
執行shell命令賦值給變數 A = $(shell uname)
檔案包含:include
註釋: “#”
特殊變數:
三、Makefile 工作常用點補充
搜尋路徑
VPATH 變數 VPATH = ./src : ./lib
vpath關鍵字(vpath<pattern> <directories> vpath %.h ../inc)
vpath %.c ./src : ./lib # 定義匹配模式(%匹配任意個字元)和搜尋路徑。
vpath %.c # 取消該模式
vpath # 取消所有模式
VPATH 和 vpath 定義的搜尋路徑僅對 makefile 規則有效,對 gcc/g++ 命令列無效,比如不能用它定義命令列標頭檔案搜尋路徑引數。
變數引用與替換
obj=$(dir:%.c=%.o) 可以將變數 dir 中所有以 c 結尾的單詞替換成以 o 結尾
$(addprefix src/, foo bar) 返回值為“src/foo src/bar”
src=$(wildcard *.c ./sub/*.c)
dir=$(notdir $(src))
obj=$(patsubst %.c,%.o,$(dir))
$(^D)
$(^F)
分別表示所有依賴檔案的目錄部分和檔案部分。(無相同的)
條件判斷
conditional-directive
text-if-true
else
text-if-false
endif
ifeq ($(CC),gcc) # 是否相等
ifdef CC # 變數是否定義
自動推導依賴關係
gcc –M main.c自動生成目標檔案和原始檔的依賴關係; -MM去除系統標頭檔案的依賴關係
maze.d,其內容是 maze.o maze.d:maze.c maze.h main.h
相關文章
- gdb基礎命令和常用操作補充
- Python基礎教程10 - 教程遺漏點補充Python
- Golang基礎語法補充Golang
- 《css基礎補充--規範》CSS
- rman基礎知識補充
- C#基礎語法補充C#
- Ninx 基礎入門補充1
- 前端基礎之jQuery重要補充前端jQuery
- Java的一些基礎補充Java
- 【Makefile】5-Makefile變數的基礎變數
- python基礎(補充):遞迴的深度Python遞迴
- Linux命令補充及基礎優化。Linux優化
- 陣列常用方法補充陣列
- C編譯: makefile基礎編譯
- C 編譯: makefile 基礎編譯
- Makefile和GCC日常用法GC
- PHP常用演算法補充PHP演算法
- Linux技術——makefile基礎Linux
- 基礎補充:使用xlrd模組讀取excel檔案Excel
- RMAN基礎知識補充 FORMAT字串格式化ORM字串格式化
- BGP基礎(簡述)歡迎有問題補充
- Jaeger知識點補充
- 『現學現忘』Git基礎 — 14、Git基礎操作的總結與補充Git
- ComfyUI 基礎教程(二) —— Stable Diffusion 文生圖基礎工作流及模型、常用節點介紹UI模型
- 牢補基礎,話說Service那點事
- bootstrap框架基礎和常用元件boot框架元件
- python基礎(補充):正經人誰用遞迴呀Python遞迴
- JavaScript核心程式設計(一點點補充)JavaScript程式設計
- git的工作管理和基礎操作Git
- RHEL3複習點和RHEL4知識點補充(轉)
- 『現學現忘』Git基礎 — 20、Git中忽略檔案補充Git
- python基礎(補充):lambda匿名函式,用了的,都說好!Python函式
- 『動善時』JMeter基礎 — 25、JMeter引數化補充練習JMeter
- mysql資料庫常用命令(補充)MySql資料庫
- C語言的本質(36)——makefile基礎C語言
- uboot和系統移植擴充套件--主Makefile分析boot套件
- 『與善仁』Appium基礎 — 9、補充:C/S架構和B/S架構說明APP架構
- camera理論基礎和工作原理