原文:http://blog.163.com/shi_shun/blog/static/2370784920106198610771/
# 每次自己写的一些小程
# 具体的含义,这里就来
CC=gcc
##########
# 递归展开式变量:
# 缺点1:使用此风格的
# 缺点2:这种风格的变
##########
SRC = main.c
code.c
TARGET = conv
OBJ := $(SRC:.c=.
##########
# 直接展开式变量
# 在使用“:=”定义变
# 变量的替换引用,格式
# “结尾”的含义是空格
##########
all:$(OBJ)
$(CC) -DDEBUG -Wall -g -o $(TARGET) $(OBJ)
##########
# 第一个规则,作为终极
##########
%.o:%.c
$(CC) -DDEBUG -Wall -g -o $@ -c $<
##########
#在模式规则中,目标
# 可以匹配任何非空字符
#在目标文件名中“%
# 依赖文件,这个
#此规则描述了一个.
# 自动化变量“$<”代
.PHONY:cle
##########
# 伪目标是这样一个目标
# 时可以指定这个目标来
# 一个伪目标称为标签。
# 使用伪目标有两点原因
# 令的目标(此目标的目
# 这个目标)和工作目录
# 时的效率。
##########
clean:
-rm -f $(OBJ)
# 下面的变量可以在shell 的环境变量里面指定。
# 也可以象下面这样在 Makefile 里面指定。
# CC=gcc # 编译器
# CFLAGS=-Wall -Werror -g # 编译器参数
# LD=gcc # 连接器参数
# LDFLAGS= $(LIBS) -lpthread # 连接器参数
# DEPENDFLAG=-MM # 生成依赖关系文件的参数
# INCLUDES=-Idir1 -Idir2 # 指明包含外部头文件的目录
# LIBS=-la -lb -lc # 指明引用外部的库文件
CFLAGS:=$(CFLAGS) $(INCLUDES)
LDFLAGS:=$(LDFLAGS) $(LIBS)
#指明项目中,包含源程序的所有的子目录。
SRCDIRS=.
#指明最终生成的可执行文件的名称
PROGRAMS=test.exe
#下面的部分一般不用改动
#从所有子目录中得到源代码的列表
SRCS=$(foreach dir,$(SRCDIRS),$(wildcard $(dir)/*.c))
#得到源代码对应的目标文件的列表
OBJS=$(SRCS:.c=.o)
#得到源代码对应的依赖关系文件的列表依赖关系文件就是一个目标文件依赖于哪些头文件和源程序,
#依赖关系是自动生成的,并且用include语句包含在Makefile中
DEPENDS=$(SRCS:.c=.d)
#指明默认目标是生成最终可执行文件。
all: $(PROGRAM)
#生成依赖关系文件
%.d:%.c
$(CC) $(DEPENDFLAG) $(CFLAGS) $< |\
sed "s?\\(.*\\):?$(basename $<).o $(basename $<).d :?g" \
> $@ || $(RM) $@
$(PROGRAMS): $(OBJS)
$(CC) $(LDFLAGS) -o $@ $(filter %.o ,$+)
# 包含入依赖关系文件
include $(DEPENDS)
# 删除生成的中间文件
clean:
rm $(OBJS) $(DEPENDS) $(PROGRAMS)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Makefile通用模板CC=gcc
CFLAGS=-Wall
OBJPATH=obj # .d文件和.o文件保存路径
TARGET=demo # 最终可执行文件
default: $(TARGET)
SOURCE=a.c b.c # 需要编译的.c文件
INCLUDE=
# 获取.d文件名集合
DEPS=$(addprefix $(OBJPATH)/, $(patsubst %.c, %.d, $(filter %.c, $(SOURCE))))
# 获取.o文件名集合
OBJS=$(addprefix $(OBJPATH)/, $(addsuffix .o, $(basename $(SOURCE))))
-include $(DEPS)
# 生成.d文件
$(OBJPATH)/%.d: %.c
$(CC) $(INCLUDE) -MM $< | sed "1s|^|$(dir $@)|" |"
sed "1{x;s|.*|$@: $<|;G;}" > $(basename $@).d
# 生成.o文件
$(OBJPATH)/%.o : %.c
$(CC) $(CFLAGS) -o $@ -c $<
# 链接成可执行文件
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) -o $@ $^
# 清理
clean:
rm -rf $(OBJPATH)/*.d $(OBJPATH)/*.o $(TARGET)