makefile学习之路——变量和函数调用小结

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 [email protected] $(OBJS)
    @echo "Target File ==> [email protected]"
    
#创建文件夹
$(DIRS):
    $(MKDIR) [email protected]
    
#根据目录完成模式替换,这里的.o文件都应该在objs文件夹下,因此
$(DIR_OBJS)/%.o : %.c
    $(CC) -o [email protected] -c $^


rebuild : clean all

all: $(TARGET)

clean :
    $(RM) $(DIRS)

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

技术分享图片


        下面增加编译选项功能

        将这部分代码修改即可

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


以上是关于makefile学习之路——变量和函数调用小结的主要内容,如果未能解决你的问题,请参考以下文章

Makefile学习之路5——通过函数增强功能

makefile学习之路——变量

Makefile学习之路——4

python之路15学习小结

JavaScript回炉重造

Java学习笔记之十九super在Java继承中的用法小结