万能的Makfile,本人今天一直学习Makefile 小有收获现在记录下来、
Makfile的嵌套调用其实就是在顶级Makefile里面通过shell执行子Makefile 来生存动态或者静态库 然后在顶级Makefile里面正确的连接就O了。
下面是例子: 不管多少个子Makefile 只要在相应的模块中复制一个 Makfile进去 修改生存的目标文件即可
有一个地方没完成、希望看到的牛哥哥 提点下、楼主我先就这么用着了!
本人测试目录:
顶级目录:
顶级makefile
include
src
module //子模块--- 》里面是*.h *.cpp Makefile
多个子模块、按照module增加就好 修改 目标文件、下面例子中有生存动态库与静态库的两种方式、
:顶级Makefile
CC = g++
LIB_PATH := ./module
SRC_PATH := ./src
INC_PATH := ./include
ALL_INC_PATH := -I$(INC_PATH) -I $(LIB_PATH)
CFLAGS:= -Wall -g $(ALL_INC_PATH)
LIB_ALL = -lpthread -L$(LIB_PATH) -ltest
SRC_FILES := $(wildcard $(SRC_PATH)/*.cpp)
OBJ_FILES := $(patsubst $.cpp ,%.o,$(SRC_FILES))
#OBJ_SO := $(LIB_PATH)/libtest.so
TARG_OBJ = bin
DEPS_FILE = makefile.deps
all:$(TARG_OBJ) $(DEPS_FILE)
$(TARG_OBJ):$(OBJ_FILES)
cd $(LIB_PATH)&&$(MAKE)
#其实我不想这样写、但是不知道 有什么办法可以调用到 -》》》》》此去在找新方法
#例如:
#$(TARG_OBJ):$(OBJ_FILES) libs
#
#libs:
# cd $(LIB_PATH)&&$(MAKE)
# 这样他会报错误:g++ libs没有找到文件
#
#$(CC) -o $@ $^ -I include -I module $(OBJ_SO)
$(CC) -o $@ $^ $(CFLAGS) -I include -I module $(LIB_ALL)
$(DEPS_FILE):$(SRC_FILES)
$(CC) -MM $(ALL_INC_PATH) $^ > $(DEPS_FILE)
-include $(DEPS_FILE)
clean_all:
-rm $(SRC_PATH)/*.o -rf
-rm $(TARG_OBJ) -rf
-rm $(DEPS_FILE) -rf
-cd $(LIB_PATH) &&$(MAKE) clean
clean:
-rm $(SRC_PATH)/*.o -rf
-rm $(TARG_OBJ) -rf
-rm $(DEPS_FILE) -rf
子Makefile文件:
CC = g++
SRC_PATH := ./
INC_PATH := ./
CFLAGS:= -Wall -g $(ALL_INC_PATH)
LIB_ALL = -lpthread
SRC_FILES := $(wildcard $(SRC_PATH)/*.cpp)
OBJ_FILES := $(patsubst $.cpp ,%.o,$(SRC_FILES))
TARG_OBJ_SO = libtest.so
TARG_OBJ = libtest.a
DEPS_FILE = makefile.deps
all:$(TARG_OBJ) $(DEPS_FILE)
$(TARG_OBJ):$(OBJ_FILES)
#$(CC) -fPIC -shared -o $@ $^
#ar -rcs $@ $^
$(CC) -o $@ $^ -lc -lm -shared
#2222-》在此处我其实不想做动态库,想用静态库、但是我生产的静态库之后 上一级的makefile调用
#会产生一个错误:module/libtest.a: could not read symbols: Archive has no index; run ranlib to add one
$(DEPS_FILE):$(SRC_FILES)
$(CC) -MM $(ALL_INC_PATH) $^ > $(DEPS_FILE)
-include $(DEPS_FILE)
clean:
-rm $(SRC_PATH)/*.o -rf
-rm $(TARG_OBJ) -rf
-rm $(TARG_OBJ_SO) -rf
-rm $(DEPS_FILE) -rf
install:
-cp libtest.a /lib
-cp libtest.so /lib