Makefile的一个模板

Makefile的一个模板
今天大概看看了Makefile,就将自己觉得重要的Makefile用法记录了下来,写成了下面的Makefile,供我以后参考:
#Makefile可以自动推导[.o]文件的依赖,如找到了whatever.o
#那么whatever.c就会是whatever.o的依赖文件
#将*.c展开
SRCS = $(wildcard *.c)
#对应的.o文件
OBJS = $(SRCS:%.c=%.o)
#字符串替换函数
#ALL = $(subst .c,,$(SRCS))
#取前缀函数
#所有的可执行文件
ALL = $(basename $(SRCS))
#定义使用的编译器
CC = gcc
PTHREAD = -pthread

.PHONY: all
all: $(ALL)

#定义目标范围内的变量,即与其相关联的规则都定义了这个变量
#还可以定义模式变量
create_threads pc: LDFLAGS = $(PTHREAD)

#有了隐含规则我们省略很多东西,如果目标文件只依赖其对应的
#.o文件时,就可以使用隐含规则,如果目标文件还依赖其他.o文件,那么就要
#显式指出这些依赖,并指明编译命令
#make可以根据隐含规则把.o文件的依赖设置成对应的.c文件
#然后调用$(CC) -c [.c] $(CPPFLAGS) $(CFLAGS)来生成.o的目标
#$(CPPFLAGS)是c预处理的参数
#对于c++,[.o]文件自动推导出依赖为[.cc]或[.C],生成命令是
#$(CXX) -c $(CPPFLAGS) $(CFLAGS)
#链接时,目标文件的依赖是对应的[.o]文件,生成命令是
#$(CC) $(LDFLAGS) [.o] $(LOADLIBES) $(LDLIBS)
#$(LDFLAGS)是链接器参数
#make还会优化一些特殊的隐含规则,而不生成中间文件
#如生成一个可执行文件可以直接使用cc -o foo foo.c
#也可以使用静态模式而不使用隐含规则
#使用静态模式可以更快捷方便
#$(OBJS): %.o: %.c
#	$(CC) $(CFLAGS) -c $<
#自动化变量只应该出现在规则的命令里.
#可以使用make来更新库函数的文件
#如:
#foolib(foolib.o): foolib.o
#	ar cr foolib foolib.o

#在命令前加上-代表不管命令执行结果如何,都认为执行成功
#可以看错忽略错误
.PHONY: clean
clean:
	-$(RM) $(OBJS) $(ALL)

下面是另一个,是我用来维护刷ACM题目的源代码的,能自动编译所有文件,当然这些文件都是独立的,不存在依赖关系。
使用make 目录名all来编译对应目录及子目录的内容。使用make 目录名clean来清理对应目录及子目录的内容。在当前目录下输入make来编译当前目录及子目录中的内容,输入make clean来清理当前目录及子目录的内容。
总控Makefile为:
export CC = gcc
export CXX = g++
export CFLAGS = -Wall
export CXXFLAGS = -Wall
DIRS = $(shell ls -F | grep /)
DIRSALL = $(DIRS:%/=%all)
DIRSCLEAN = $(DIRS:%/=%clean)
CSRCS = $(wildcard *.c)
COBJS = $(CSRCS:%.c=%.o)
CPPSRCS = $(wildcard *.cpp)
CPPOBJS = $(CPPSRCS:%.cpp=%.o)
OBJS = $(COBJS) $(CPPOBJS)
SRCS = $(CSRCS) $(CPPSRCS)
ALL = $(basename $(SRCS))

.PHONY: all clean $(DIRSALL) $(DIRSCLEAN)
all: $(DIRSALL) $(ALL)
$(DIRSALL): %:
	@cd $(subst all,,$@); make all;
$(DIRSCLEAN): %:
	@cd $(subst clean,,$@); make clean;
clean: $(DIRSCLEAN)
	$(RM) $(OBJS) $(ALL)

然后在每个子目录下也放一个这个Makefile的拷贝就可以了。除了总控Makefile外,其他的Makefile都可以不需要前四行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值