Makefile递归遍历目录(含子目录)编译动态库-创新互联

这里推荐一本书,Makefile手册,写的挺好的~

创新互联从2013年创立,先为同安等服务建站,同安等地企业,进行企业商务咨询服务。为同安企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。

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

直接上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中

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


分享文章:Makefile递归遍历目录(含子目录)编译动态库-创新互联
分享路径:http://pwwzsj.com/article/cdgcgs.html