您的位置:首页 > 其它

Makefile 递归遍历目录(含子目录) 编译动态库

2014-05-21 17:06 387 查看



这里推荐一本书,Makefile手册,本人正在学习,多交流~

一、统一编译所有子目录的文件

直接上Makefile内容了,

AR=ar

LD=ld

CC=gcc

CFLAGS = -O2 -Wall -I./Test \

-I./Test/Test1 \

#注:"\"后面不能有空格,并且该句写完后最好有个换行

#注释部分推荐在单独的一行编写

#动态库需要 -fPIC -shared

SOFLAGS = -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_%,%,$@) clean
clean: $(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中
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: