make使用總結(6)-Makefile編寫
阿新 • • 發佈:2020-12-28
技術標籤:make使用總結makefile編寫例程
make使用總結(6)-Makefile編寫
有了前面的知識基礎我們就可以編寫Makefile檔案了。
首先編寫一個最簡單的Makefile檔案。檔案需要遵循如下要求:
- 所有的檔案都在同級目錄下。包括
.h
檔案,.c
檔案,以及生成的.o
檔案。 - 原始檔需要手動的新增到Makefile檔案中。
- 當
.h
檔案發生變化時,需要先make clean
,再make
.
例程原始碼連結:<>.
工程目錄如下:
Makefile檔案如下:
# 檔案說明
# 所有的檔案都在同級目錄下。包括`.h`檔案,`.c`檔案,以及生成的`.o`檔案。
# 原始檔需要手動的新增到Makefile檔案中。
# 當`.h`檔案發生變化時,需要先`make clean`,再`make`.
# 要生成的檔名
BIN := main
# 要編譯的原始檔
SRCS := main.c common.c
OBJS := $(SRCS:.c=.o)
# 編譯工具鏈
CC ?= gcc
INC_DIR ?= ./
WARNINGS ?= -Werror -Wall
CFLAGS ?= -O3 -g0 -I$(INC_DIR) $(WARNINGS)
LDFLAGS ?=
$(BIN):$(OBJS)
$(CC) -o [email protected] $^ $(LDFLAGS)
%.o:%.c
$(CC) $(CFLAGS) -c -o [email protected] $<
.PHONY:clean
clean:
rm -f *.o $(BIN)
上面就是一個最簡單的專案工程的Makefile檔案了。當我們在工程中新增原始檔時,同時需要在SRCS
變數後追加原始檔名。下面我們簡單解析解析這個檔案。
檔案的第一部分:基礎設定
BIN := main
SRCS := main.c common.c
OBJS := $(SRCS:.c=.o)
其中BIN := main
SRCS := main.c common.c
為工程原始檔的獲取。OBJS := $(SRCS:.c=.o)
為中間目標檔名定義。採用替換引用
的方式,將SRCS
變數中的所有.c
替換為.o
.即OBJS := main.o common.o
.用於後面最終檔案main
的依賴列表。
他們三個變數都使用了立即賦值
。
檔案的第二部分:工具鏈的設定
# 編譯工具鏈
CC ?= gcc
INC_DIR ?= ./
WARNINGS ?= -Werror -Wall
CFLAGS ?= -O3 -g0 -I$(INC_DIR) $(WARNINGS)
LDFLAGS ?=
其中CC ?= gcc
INC_DIR ?= ./
定義了gcc標頭檔案獲取的路徑。此處為當前目錄。WARNINGS ?= -Werror -Wall
編譯鏈編譯時的警告相關設定。具體可以參看gcc的-W
選項含義。CFLAGS ?= -O3 -g0 -I$(INC_DIR)/ $(WARNINGS)
定義的編譯鏈在編譯時的引數。具體參見gcc.LDFLAGS ?=
定義編譯鏈在連結時的引數。具體參見gcc.
檔案的第三部分:規則
$(BIN):$(OBJS)
$(CC) -o [email protected] $^ $(LDFLAGS)
%.o:%.c
$(CC) $(CFLAGS) -c -o [email protected] $<
其中%.o:%.c
的規則用於為每個.c
檔案生成對應的.o
檔案。此處使用了通用匹配符%
.因此可以匹配main.c和common.c,然後用此規則的shell命令$(CC) $(CFLAGS) -c -o [email protected] $<
生成main.o和common.o.其中[email protected]
和$<
為自動變數。這條規則在生成main.o時等價於
main.o:main.c
gcc -O3 -g0 -I./ $(WARNINGS) -Werror -Wall -c -o main.o main.c
$(BIN):$(OBJS)
的原理與%.o:%.c
的原理一樣。
檔案的第四部分:清除命令
.PHONY:clean
clean:
rm -f *.o $(BIN)
.PHONY:clean
使用偽目標來指明下文的clean
目標為動作目標。
clean:
規則用於刪除產生的中間檔案。使用make clean
呼叫。
關於技術交流
此處後的文字已經和題目內容無關,可以不看。
qq群:825695030
微信公眾號:嵌入式的日常
如果上面的文章對你有用,歡迎打賞、點贊、評論。