前段时间将自己写的一个工程弄到linux上面,为了写通用的makefile,折腾了一阵子。 网上找过不少,但是都是不能直接用,各种报错,干脆就直接开搞。 新手写makefile推荐那个 陈皓 大神 的 《跟我一起学Makefile》这个教程,确实非常不错。 以前也会写makefile ,但是对于多目录,可通用的makefile,一直写不出来。 看完教程后,再结合网上的例子,不断调整,终于得到了一个可用的版本。 而且舍弃了依赖文件的生成,好了,扯了那么久,直接放代码吧。 直接将下面的文件放到静态库工程的根目录即可。例如我的目录结构是 –Engine(静态库工程) —-subDir —–subDir —-subDir 直接放到Engine目录即可 makefile 文件:
############################################
#makefile for GameWorld
#authorroyalchen
#date2017-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 即可在根目录生成静态库文件,
- 本文作者: royalchen
- 本文链接: http://www.royalchen.com/2017/08/08/linux-多目录下下生成静态库-makefile,/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!