#编译程序名称
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)/
linux下系统的makefile编写
最新推荐文章于 2024-10-11 19:12:12 发布
这个博客详细介绍了如何在Linux系统中构建C++程序。它涵盖了设置编译器、目标目录、头文件路径、系统库和静态库的步骤,并通过Makefile实现Release和Debug模式的编译。此外,还根据不同的处理器架构调整库路径。
摘要由CSDN通过智能技术生成