Makefile参考样例3:多个文件夹.c的编译

来源:互联网 发布:淘宝 无踪之岛的馈赠 编辑:程序博客网 时间:2024/06/04 19:59

上一篇的Makefile写得太过复杂,且不支持同名.c文件,因此经过改良后,又来一发Makefile参考样例3;

优点:代码简洁,容易解理,能自动检查头文件依赖关系,支持不同文件夹下面有相同的文件名的.c文件;

缺点:所有编译的中间文件与源码在同一路径,会造成一些文件污染,好在make clean可以干净地清除这些中间文件;


代码如下:

#这是一个makefile的样例,用于编译多文件夹,多文件的编译#编译工具链CC= gccCXX= g++LD= $(CC)AS= nasm#编译选项ASFLAGS  = -m32CFLAGS   = -m32 -Wall $(incdir) CXXFLAGS = -m32 -Wall $(incdir)LDFLAGS = -m32 -static#定义输出文件名target = main.exe#定义源码目录srcdir = src \         src/dir1 \         src/dir2 \         src/dir2/sub1 \         src/dir2/sub2#定义包含目录incdir = $(foreach dir,$(srcdir),-I$(dir))#定义附加依赖库inclib = -lpthread#遍历所有dir,并搜索该dir下面的所有.c文件allsrc = $(foreach dir,$(srcdir),$(wildcard $(dir)/*.c))#把所有的.c替换为.oallobj = $(allsrc:%.c=%.o)#把所有的.c替换为.dalldep = $(allsrc:%.c=%.d)#生成.d的规则%.d: %.c@echo Generating $@...@$(CC) -MM -MT "$(<D)/$(*F).o $@" $(CFLAGS) $< >$@#生成.o的规则%.o: %.c@echo Compiling $<...@$(CC) $(CFLAGS) -c $< -o $@#如果不是第1次调用make,则包含所有.d文件ifneq ($(MAKELEVEL), 0)include $(alldep)endif#声明虚拟目标.PHONY:init cleaninit: $(alldep)@$(MAKE) -s $(target)ifneq ($(MAKELEVEL), 0)$(target): $(alldep) $(allobj)@echo Linking target...@$(LD) $(LDFLAGS) -o $@ $(allobj) $(inclib)@echo Link done!endifclean:@rm -rf $(alldep) $(allobj) $(target)@echo clean done.



0 0
原创粉丝点击