makefile學習之路——變量和函數調用小結
阿新 • • 發佈:2018-04-01
makefile 為了能夠鞏固之前的學習,這裏用一個小項目來完成變量和函數的總結。
需求如下:
1、 自動生成target文件夾存放可執行文件
2、 自動生成objs文件夾存放編譯生成的目標文件
3、 支持調試版本的編譯選項
4、 考慮代碼的擴展性
#使用的命令 CC := gcc MKDIR := mkdir RM := rm -rf #目標文件夾 DIR_OBJS := objs DIR_TARGET := target #輔助變量 DIRS := $(DIR_OBJS) $(DIR_TARGET) #目標 TARGET := $(DIR_TARGET)/hello-makefile.out #源文件, 通過使用預定義函數獲取 SRCS := $(wildcard *.c) #main.c const.c fun.c #根據源文件,獲取目標文件,然後,將目標文件放到文件夾下 OBJS := $(SRCS:.c=.o) #main.o const.o fun.o OBJS := $(addprefix $(DIR_OBJS)/, $(OBJS)) #objs/main.o objs/const.o objs/fun.o #定義偽目標 .PHONY : rebuild clean all #定義最終規則 $(TARGET) : $(DIRS) $(OBJS) $(CC) -o $@ $(OBJS) @echo "Target File ==> $@" #創建文件夾 $(DIRS): $(MKDIR) $@ #根據目錄完成模式替換,這裏的.o文件都應該在objs文件夾下,因此 $(DIR_OBJS)/%.o : %.c $(CC) -o $@ -c $^ rebuild : clean all all: $(TARGET) clean : $(RM) $(DIRS)
上面是不考慮調試的代碼,運行結果如下
下面增加編譯選項功能
將這部分代碼修改即可
$(DIR_OBJS)/%.o : %.c $(CC) -o $@ -c $^ $(DIR_OBJS)/%.o : %.c ifeq ($(DEBUG), true) $(CC) -o $@ -g -c $^ else $(CC) -o $@ -c $^ endif
makefile學習之路——變量和函數調用小結