make使用總結(8)-Makefile編寫
阿新 • • 發佈:2020-12-23
make使用總結(8)-Makefile編寫
中小型專案Makefile模板
相比較前兩次編寫的Makefile,這節的Makefile將表現的更加出色。具體特點如下
- 生成的.d,.o等中間檔案存放在$(OBJPATH)目錄下.如 OBJPATH := obj 表明存放在obj目錄下
- .c檔案可以存放在$(SRCPATH)指定的多個目錄下。如 SRCPATH := ./ src1/表明原始檔可以存放在當前目錄、src1目錄。
- 存放在$(SRCPATH)目錄下的原始檔會被自動新增到專案
- gcc編譯時需要的標頭檔案路徑通過$(INC_DIRS)變數來新增
- 解決了標頭檔案依賴的問題
從上面的特點可以看出,這個Makefile使用於大部分的中小型專案。在使用時只需修改一下SRCPATH
變數和INC_DIRS
即可。
例程原始碼連結:<>.
工程目錄如下:
Makefile檔案如下:
# 檔案說明 # 適用於中小型專案。此Makefile的特點如下 # 1. 生成的.d,.o等中間檔案存放在$(OBJPATH)目錄下.如 OBJPATH := obj 表明存放在obj目錄下 # 1. .c檔案可以存放在$(SRCPATH)指定的多個目錄下。如 SRCPATH := ./ src1/ src2/ 表明原始檔可以存放在當前目錄、src1目錄、src2目錄 # 1. 存放在$(SRCPATH)目錄下的原始檔會自動新增到專案 # 1. 標頭檔案路徑通過$(INC_DIRS)變數來新增 # 1. 解決了標頭檔案依賴的問題 BIN := main OBJPATH := obj SRCPATH := ./ src/ src/module/ SRCS := SRCS += $(foreach eachpath,$(SRCPATH), $(notdir $(wildcard $(eachpath)*.c))) OBJS := $(patsubst %.c, $(OBJPATH)/%.o, $(notdir $(SRCS))) DEPS := $(patsubst %.c, $(OBJPATH)/%.d, $(notdir $(SRCS))) CC := gcc INC_DIRS := ./include/ ./src/module/ I_INC_DIRS := $(addprefix -I,$(INC_DIRS)) WARNINGS := -Werror -Wall CFLAGS := -O3 -g0 $(I_INC_DIRS) $(WARNINGS) LDFLAGS := VPATH += $(foreach eachpath,$(SRCPATH), :$(eachpath)) $(shell if [ ! -d $(OBJPATH) ]; then mkdir -p $(OBJPATH); fi) $(BIN):$(OBJS) $(CC) -o
[email protected] $^ $(LDFLAGS) $(OBJPATH)/%.o:%.c $(CC) $(CFLAGS) -c -o [email protected] $< $(OBJPATH)/%.d:%.c @$(CC) -MM $(CFLAGS) $< | sed 's,\($*\)\.o[:]*,$(OBJPATH)/\1.o [email protected]:,g' > [email protected] .PHONY:clean clean: rm -f $(OBJPATH)/*.o $(OBJPATH)/*.d $(BIN) -include $(DEPS)
相比較於前一個Makefile,這個Makefile並沒有太大的改動。只是添加了原始檔的自動獲取及一些存放位置的優化。
檔案自動獲取部分:
SRCPATH := ./ src/ src/module/
SRCS :=
SRCS += $(foreach eachpath,$(SRCPATH), $(notdir $(wildcard $(eachpath)*.c)))
VPATH += $(foreach eachpath,$(SRCPATH), :$(eachpath))
SRCPATH := ./ src/ src/module/
.首先由使用者指定原始檔的路徑表。- 然後使用迴圈函式在這些目錄中一一獲取每個檔案的檔名並追加賦值給
SRCS
變數。 VPATH += $(foreach eachpath,$(SRCPATH), :$(eachpath))
:通過VPATH
變數讓make知道獲取原始檔的搜尋路徑。
$(shell if [ ! -d $(OBJPATH) ]; then mkdir -p $(OBJPATH); fi)
使用shell的if命令在OBJPATH
目錄不存在時建立此目錄。
INC_DIRS := ./include/ ./src/module/
I_INC_DIRS := $(addprefix -I,$(INC_DIRS))
gcc在編譯檔案時需要知道使用到的標頭檔案存放目錄。使用-I
選項指定。這兩條語句就是為了此目的。
關於技術交流
此處後的文字已經和題目內容無關,可以不看。
qq群:825695030
微信公眾號:嵌入式的日常
如果上面的文章對你有用,歡迎打賞、點贊、評論。