1. 程式人生 > 其它 >make使用總結(6)-Makefile編寫

make使用總結(6)-Makefile編寫

技術標籤:make使用總結makefile編寫例程

make使用總結(6)-Makefile編寫

有了前面的知識基礎我們就可以編寫Makefile檔案了。

首先編寫一個最簡單的Makefile檔案。檔案需要遵循如下要求:

  1. 所有的檔案都在同級目錄下。包括.h檔案,.c檔案,以及生成的.o檔案。
  2. 原始檔需要手動的新增到Makefile檔案中。
  3. .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

定義了用到的編譯鏈為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
微信公眾號:嵌入式的日常
如果上面的文章對你有用,歡迎打賞、點贊、評論。二維碼