linux 多目录下生成静态库的通用 makefile


前段时间将自己写的一个工程弄到linux上面,为了写通用的makefile,折腾了一阵子。

网上找过不少,但是都是不能直接用,各种报错,干脆就直接开搞。

新手写makefile推荐那个 陈皓 大神 的 《跟我一起学Makefile》这个教程,确实非常不错。

以前也会写makefile ,但是对于多目录,可通用的makefile,一直写不出来。

看完教程后,再结合网上的例子,不断调整,终于得到了一个可用的版本。

而且舍弃了依赖文件的生成,好了,扯了那么久,直接放代码吧。

直接将下面的文件放到静态库工程的根目录即可。例如我的目录结构是

–Engine(静态库工程)

—-subDir

—–subDir

—-subDir

直接放到Engine目录即可

makefile 文件:

############################################
#makefile for GameWorld
#author	royalchen
#date	2017-07-27
############################################

#set project dir
PROJECT_DIR		:=$(shell pwd)
PROJECT_BIN_DIR	:=../bin/
PROJECT_LIB_DIR	:=../lib/
LIB_NAME		:= libEngine.a #这里可以修改生成的文件名

#set build param
CC	:= clang++ #编译器
CFLAG	:= -I$(PROJECT_DIR) -std=c++11 -lstdc++ -D _DEBUG  #编译参数 
LIBS	:= -lMessage  #编译所需的链接库
RM :=rm


#set file dir
SEARCH_FILE	= $(wildcard $(subdir)/*.h $(subdir)/*.cpp)
CUR_SRC_DIR	= $(shell ls -AxR $(PROJECT_DIR)|grep ":"|tr -d ':')
CUR_SRC 	:= $(foreach subdir,$(CUR_SRC_DIR),$(SEARCH_FILE))
CUR_H		:= $(filter %.h, $(CUR_SRC))
CUR_CPP 	:= $(filter %.cpp, $(CUR_SRC))
CUR_CPP_DIR	:= $(dir $(CUR_CPP))
CUR_CPP_DIR	:= $(sort $(CUR_CPP_DIR))
CUR_H_DIR	:= $(dir $(CUR_H))
CUR_H_PRE	:= $(addprefix -I,$(CUR_H_DIR))

#set obj dir
CUR_OBJ		:=$(strip $(CUR_CPP:.cpp=.o))
CUR_OBJ_EX	:=$(patsubst %.o,%,$(CUR_OBJ))
CUR_DEP		:=$(strip $(CUR_CPP:.cpp=.d) $(CUR_H:.h=.d))


define build_obj
$1:$2
	$(CC) -c $(CFLAG) -o $1 $2 
endef

define build_dep
$2:$1
	$(CC) $(CFLAG) -MM $1 >$2
endef


$(foreach tmp,$(CUR_OBJ_EX),$(eval $(call build_dep,$(tmp).cpp,$(tmp).d)))

$(foreach tmp,$(CUR_OBJ_EX),$(eval $(call build_obj,$(tmp).o,$(tmp).cpp)))

.PHONY:all
all:$(LIB_NAME)

$(LIB_NAME):$(CUR_OBJ)
	@echo "start build $(LIB_NAME).."
	ar cr $(PROJECT_LIB_DIR)$@ $^ 
	@echo "build $(LIB_NAME) success!"

.PHONY:clean
clean :
	@$(RM) -rf $(CUR_OBJ) $(PROJECT_LIB_DIR)$(LIB_NAME) $(CUR_DEP)

关键函数是  eval,foreach ,遍历所有目录,生成对应的obj文件

执行 make all 即可在根目录生成静态库文件,


《 “linux 多目录下生成静态库的通用 makefile” 》 有 4 条评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注