为了能够巩固之前的学习,这里用一个小项目来完成变量和函数的总结。

        需求如下:

        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)

        上面是不考虑调试的代码,运行结果如下

makefile学习之路——变量和函数调用小结_第1张图片


        下面增加编译选项功能

        将这部分代码修改即可

$(DIR_OBJS)/%.o : %.c
    $(CC) -o $@ -c $^
    
    
    
    
$(DIR_OBJS)/%.o : %.c
    ifeq ($(DEBUG), true)
        $(CC) -o $@ -g -c $^
    else
        $(CC) -o $@ -c $^
    endif



交流QQ群:199546072