我是靠谱客的博主 光亮煎蛋,最近开发中收集的这篇文章主要介绍Makefile参考样例4:多个文件夹.c的编译,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

对于上一篇的makefile的缺点,经过改良后行成了下面的makefile;
主要改动是把编译过程的中间文件(*.d, *.o)放到一个单独的文件夹,clean的时候删除该中间文件夹,不会污染源码文件夹。


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


#这是一个makefile的参考样例,用于编译多文件夹,多文件
#编译工具链
CC	= gcc
CXX	= g++
LD	= $(CC)
AS	= nasm

#编译选项
ASFLAGS  = -m32
CFLAGS   = -m32 -Wall $(incdir)	 
CXXFLAGS = -m32 -Wall $(incdir)
LDFLAGS	 = -m32 -static

#定义输出文件名
target = main.exe

#定义根目录
objdir = obj
srcdir = src

#定义源码子目录
subdir = . 
         src 
		 dir1 
		 dir2 
		 dir2/sub1 
		 dir2/sub2

#定义包含目录
incdir = $(foreach dir, $(subdir), -I$(srcdir)/$(dir))

#定义附加依赖库
inclib = -lpthread

#遍历所有dir,并搜索该dir下面的所有.c文件
allsrc = $(foreach dir, $(subdir), $(wildcard $(srcdir)/$(dir)/*.c))

#把所有的.c替换为.o
allobj = $(patsubst $(srcdir)/%.c, $(objdir)/%.o, $(allsrc))

#把所有的.c替换为.d
alldep = $(patsubst $(srcdir)/%.c, $(objdir)/%.d, $(allsrc))

#生成.d的规则
$(objdir)/%.d: $(srcdir)/%.c
	@echo Generating $@...
	@$(CC) -MM -MT "$(patsubst $(srcdir)/%.c, $(objdir)/%.o, $<) $@" $(CFLAGS) $< >$@
	
#生成.o的规则
$(objdir)/%.o: $(srcdir)/%.c
	@echo Compiling $<...
	@$(CC) $(CFLAGS) -c $< -o $@
	
#如果是第3次调用make,则包含所有.d文件	
ifeq ($(MAKELEVEL), 2)
include $(alldep)
endif
	
#声明虚拟目标
.PHONY:	init clean

init: 
	@mkdir -p $(dir $(allobj))
	@$(MAKE) -s depend
	
depend: $(alldep)
	@$(MAKE) -s target

target: $(alldep) $(allobj)
	@echo Linking target...
	@$(LD) $(LDFLAGS) -o $(target) $(allobj) $(inclib)
	@echo Link done!
	
clean:
	@rm -rf $(target) $(objdir)
	@echo clean done.

最后

以上就是光亮煎蛋为你收集整理的Makefile参考样例4:多个文件夹.c的编译的全部内容,希望文章能够帮你解决Makefile参考样例4:多个文件夹.c的编译所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(33)

评论列表共有 0 条评论

立即
投稿
返回
顶部