概述
对于上一篇的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的编译所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复