Makefile 递归遍历目录(含子目录) 编译动态库
2016-07-13 08:07
1706 查看
这里推荐一本书,Makefile手册,写的挺好的~一、统一编译所有子目录的文件直接上Makefile内容了,AR=ar
LD=ld
CC=gccCFLAGS = -O2 -Wall -I./Test \
-I./Test/Test1 \#注:"\"后面不能有空格,并且该句写完后最好有个换行#注释部分推荐在单独的一行编写 #动态库需要 -fPIC -sharedSOFLAGS = -O2 -fPIC -shared
TARGET = ./libSDK.so#这里递归遍历3级子目录
DIRS := $(shell find . -maxdepth 3 -type d)#这里循环遍历目录的cpp文件FILES = $(foreach dir,$(DIRS),$(wildcard $(dir)/*.cpp))#定义宏DEF = -DLINUX -DENABLE_EPOLL#替换文件后缀 ,也可以写成 OBJS = $(FILES:%.cpp=%.o)OBJS = $(patsubst %.cpp,%.o, $(FILES))
# Search paths
VPATH =.cpp.o:
$(CC) -c $(CFLAGS) $(DEF) -D__cplusplus $< -o $@
.c.o:
$(CC) -c $(CFLAGS) $< -o $@
LIBS = -lpthread -lm -lstdc++
$(TARGET):$(OBJS)
$(CXX) $(SOFLAGS) -o $@ $(OBJS) $(LIBS)
# $(OBJS):%.o:%.cpp
# $(CXX) $(LINKFLAGS) $(CXXFLAGS) -o $(TARGET) $(OBJS) $(LIBS)
# $(CXX) $(CXXFLAGS) -c -o $@ $<
clean:
$(RM) $(TARGET)
$(RM) $(OBJS) 二、按目录编译 参考:http://wdtxslqnn.blog.163.com/blog/static/4424648520132220651511/要对子目录执行make,需要在当前目录制作一个Makefile,遍历所有子目录的Makefile,并运行相应的make target. 以下是我用来编译内核模块的一个Makefile## Reference http://www.gnu.org/software/make/manual/make.html## 需要排除的目录exclude_dirs := include bin# 取得当年子目录深度为1的所有目录名称dirs := $(shell find . -maxdepth 1 -type d)dirs := $(basename $(patsubst ./%,%,$(dirs)))dirs := $(filter-out $(exclude_dirs),$(dirs))# 避免clean子目录操作同名,加上_clean_前缀SUBDIRS := $(dirs)clean_dirs := $(addprefix _clean_,$(SUBDIRS) )#.PHONY: subdirs $(SUBDIRS) clean# 执行默认make target$(SUBDIRS): $(MAKE) -C $@subdirs: $(SUBDIRS)# 执行clean$(clean_dirs): $(MAKE) -C $(patsubst _clean_%,%,$@) cleanclean: $(clean_dirs) @find . / /( -name '*.[oas]' -o -name '*.ko' -o -name '.*.cmd' /-o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' /-o -name '*.symtypes' /) /-type f -print | xargs rm -f 三、编译错误多的情况当我们执行make之后,发现出现的错误和警告信息较多,无法从头开始查看,这里提供一种shell的重定向输出到文件的方法make 2> make_print.txt 数字 含义 标准叫法
0 标准输入 stdin = standard input
1 标准输出 stdout = standard output
2 标准错误输出 stderr = standard error这样终端就看不到错误输出,而错误输出都会保存在make_print.txt中
LD=ld
CC=gccCFLAGS = -O2 -Wall -I./Test \
-I./Test/Test1 \#注:"\"后面不能有空格,并且该句写完后最好有个换行#注释部分推荐在单独的一行编写 #动态库需要 -fPIC -sharedSOFLAGS = -O2 -fPIC -shared
TARGET = ./libSDK.so#这里递归遍历3级子目录
DIRS := $(shell find . -maxdepth 3 -type d)#这里循环遍历目录的cpp文件FILES = $(foreach dir,$(DIRS),$(wildcard $(dir)/*.cpp))#定义宏DEF = -DLINUX -DENABLE_EPOLL#替换文件后缀 ,也可以写成 OBJS = $(FILES:%.cpp=%.o)OBJS = $(patsubst %.cpp,%.o, $(FILES))
# Search paths
VPATH =.cpp.o:
$(CC) -c $(CFLAGS) $(DEF) -D__cplusplus $< -o $@
.c.o:
$(CC) -c $(CFLAGS) $< -o $@
LIBS = -lpthread -lm -lstdc++
$(TARGET):$(OBJS)
$(CXX) $(SOFLAGS) -o $@ $(OBJS) $(LIBS)
# $(OBJS):%.o:%.cpp
# $(CXX) $(LINKFLAGS) $(CXXFLAGS) -o $(TARGET) $(OBJS) $(LIBS)
# $(CXX) $(CXXFLAGS) -c -o $@ $<
clean:
$(RM) $(TARGET)
$(RM) $(OBJS) 二、按目录编译 参考:http://wdtxslqnn.blog.163.com/blog/static/4424648520132220651511/要对子目录执行make,需要在当前目录制作一个Makefile,遍历所有子目录的Makefile,并运行相应的make target. 以下是我用来编译内核模块的一个Makefile## Reference http://www.gnu.org/software/make/manual/make.html## 需要排除的目录exclude_dirs := include bin# 取得当年子目录深度为1的所有目录名称dirs := $(shell find . -maxdepth 1 -type d)dirs := $(basename $(patsubst ./%,%,$(dirs)))dirs := $(filter-out $(exclude_dirs),$(dirs))# 避免clean子目录操作同名,加上_clean_前缀SUBDIRS := $(dirs)clean_dirs := $(addprefix _clean_,$(SUBDIRS) )#.PHONY: subdirs $(SUBDIRS) clean# 执行默认make target$(SUBDIRS): $(MAKE) -C $@subdirs: $(SUBDIRS)# 执行clean$(clean_dirs): $(MAKE) -C $(patsubst _clean_%,%,$@) cleanclean: $(clean_dirs) @find . / /( -name '*.[oas]' -o -name '*.ko' -o -name '.*.cmd' /-o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' /-o -name '*.symtypes' /) /-type f -print | xargs rm -f 三、编译错误多的情况当我们执行make之后,发现出现的错误和警告信息较多,无法从头开始查看,这里提供一种shell的重定向输出到文件的方法make 2> make_print.txt 数字 含义 标准叫法
0 标准输入 stdin = standard input
1 标准输出 stdout = standard output
2 标准错误输出 stderr = standard error这样终端就看不到错误输出,而错误输出都会保存在make_print.txt中
相关文章推荐
- C#递归算法之分而治之策略
- CMD下一个命令遍历目录并删除相同文件的代码
- 有关数据库SQL递归查询在不同数据库中的实现方法
- dos下遍历目录和文件的代码(主要利用for命令)
- C#中的递归APS和CPS模式详解
- WinForm实现按名称递归查找控件的方法
- C#递归方法实现无限级分类显示效果实例
- 使用SqlServer CTE递归查询处理树、图和层次结构
- C#递归算法之打靶算法分析
- C#中的尾递归与Continuation详解
- C#递归实现显示文件夹及所有文件并计算其大小的方法
- php递归创建目录的方法
- asp遍历目录及子目录的函数
- PHP递归创建多级目录
- Javascript递归打印Document层次关系实例分析
- C#递归算法寻找数组中第K大的数
- C++使用递归方法求n阶勒让德多项式完整实例
- C#用递归算法解决经典背包问题
- oracle 使用递归的性能提示测试对比
- 使用curl递归下载软件脚本分享