linux下系统的makefile编写

这个博客详细介绍了如何在Linux系统中构建C++程序。它涵盖了设置编译器、目标目录、头文件路径、系统库和静态库的步骤,并通过Makefile实现Release和Debug模式的编译。此外,还根据不同的处理器架构调整库路径。
摘要由CSDN通过智能技术生成
#编译程序名称
APPNAME = XXX
#编译程序生成临时文件(.o)目录
OBJDIR = build/

CC = g++

#头文件目录
SYSCLUDE = -I ./include_linux

#程序用到的系统的头文件
SYSTEMLIB = -ldl -lz -pthread

#静态库文件
LIBPATH = -L./lib_x86
COMMON_LIB = $(LIBPATH) -lcurl -lssl -lcrypto -lsqlite3 -lcares

#添加工程的cpp文件,只支持搜索一层目录
#CODEDIR = $(filter-out %/$(OBJDIR),$(shell find $(shell pwd) -maxdepth 2 -type d))
CODEDIR = $(filter-out %/$(OBJDIR),dfdll)


CPPPATH :=$(foreach subpath,$(CODEDIR),$(subpath))
VPATH = $(patsubst -IXXIMWXX,,$(CPPPATH))

#添加工程的头文件
HEADDIR = $(filter-out %/$(OBJDIR),$(shell find . -maxdepth 3 -type d))

#各个子目录下面的cpp文件
CPPFILES =$(wildcard $(addsuffix /*.cpp,$(CODEDIR)))

#各个子目录下面的c文件
CFILES =$(wildcard $(addsuffix /*.c,$(CODEDIR)))

#定义源文件的关联关系文件名(*.d)
DFILES = $(addprefix $(OBJDIR),$(notdir $(CPPFILES:.cpp=.d)))

LIBTYPE = $(shell uname -i)

#定义编译发行版本(Release)时产生的*.o文件名
RELEASEOBJ = $(patsubst %.cpp,$(OBJDIR)/%.o,$(notdir $(CPPFILES)))

#定义编译调试版本(Debug)时产生的*.dbg.o文件名
DEBUGOBJ = $(patsubst %.cpp,$(OBJDIR)/%.dbg.o,$(notdir $(CPPFILES)))

#无效的目录替换成下面的字符串
FATALERR=XXIMWXX

#所有的子目录
INCLUDETMPFLAG:=$(foreach subpath,$(HEADDIR),-I $(subpath))
INCLUDEFLAG = $(patsubst -I$(FATALERR),,)

#指定编译调试版本(Debug)时的编译参数
DEBUGFLAG = $(CC) -fPIC -c -w -rdynamic -g -D _DEBUG $(INCLUDEFLAG) $(SYSCLUDE)

#指定编译发行版本(Release)时的编译参数
RELEASEFLAG = $(CC) -fPIC -c -w -rdynamic $(INCLUDEFLAG) $(SYSCLUDE)

ifeq ($(LIBTYPE),aarch64)
LIBPATH = -L./lib_arrch
endif
ifeq ($(LIBTYPE),mips64)
LIBPATH = -L./lib_mips
endif

all : Release

Release : $(DFILES)
Release : $(RELEASEOBJ)
Release :
		echo Release
		$(CC) -shared -fPIC $(CFLAGS) $(BITFLAG) -o $(APPNAME) $(RELEASEOBJ) $(COMMON_LIB) $(SYSTEMLIB) -Wl,-Bsymbolic

Debug : $(DFILES)
Debug : $(DEBUGOBJ)
Debug :
		echo Debug
		$(CC) -shared -fPIC $(CFLAGS) $(BITFLAG) -o $(APPNAME) $(DEBUGOBJ) $(COMMON_LIB) $(SYSTEMLIB) -Wl,-Bsymbolic

#*.d文件的产生方法
$(DFILES): $(OBJDIR)%.d : %.cpp
		@echo 正在分析文件:$<; mkdir -p $(OBJDIR);\
		$(if $(shell $(CC) -MM $(INCLUDEFLAG) $<),echo $(OBJDIR)/$(shell $(CC) -MM $(INCLUDEFLAG) $<) > $@, $(error 分析文件:$(patsubst %.d,%.cpp,$@)失败)); \
		echo '	'$(RELEASEFLAG) $< -o $(patsubst %/,$(OBJDIR)/,$(patsubst %.d,%.o,$@)) >>$@; \
		echo $(patsubst %.o:,%.dbg.o:,$(OBJDIR)/$(shell $(CC) -MM $(INCLUDEFLAG) $<)) >>$@; \
		echo '	'$(DEBUGFLAG) $< -o $(patsubst %/,$(OBJDIR)/,$(patsubst %.d,%.dbg.o,$@)) >>$@

#如果不是要clean的话
ifneq ($(MAKECMDGOALS),clean)
#装载自动产生的*.d文件
-include $(DFILES)
endif

#.PHONY:print
#print:
#		@echo $(VPATH)

.PHONY:clean
clean:
		rm -rf $(APPNAME) *.o *.d *.dbg.o $(OBJDIR)/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值