前段时间将自己写的一个工程弄到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 条评论
感受学习的力量!
如果上天再给我一次机会,我会对你的博客说,下次还来看你!
test https测试
Thanks for finally writing about >linux 多目录下生成静态库的通用 makefile |
royalchen的博客 <Liked it!