1. 程式人生 > >makefile學習之路——變量和函數調用小結

makefile學習之路——變量和函數調用小結

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學習之路——變量和函數調用小結