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


这里推荐一本书,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中

### 回答1: 您可以使用下面的makefile编译子目录:SUBDIRS = dir1 dir2 dir3all: $(SUBDIRS)$(SUBDIRS): $(MAKE) -C $@clean: for dir in $(SUBDIRS); do \ $(MAKE) -C $$dir clean; \ done ### 回答2: 可以使用makefile中的变量和通配符来实现编译子目录的功能。 假设项目结构如下: ``` - main.c - makefile - subdirectory1/ - file1.c - file2.c - subdirectory2/ - file3.c - file4.c ``` 下面是一个示例的makefile,用于编译子目录: ```makefile SRC_DIR := . SUBDIRS := subdirectory1 subdirectory2 CC := gcc CFLAGS := -Wall .PHONY: all clean $(SUBDIRS) all: $(SUBDIRS) $(SUBDIRS): @echo "\nCompiling directory $@" $(MAKE) -C $@ $(MAKECMDGOALS) clean: @for dir in $(SUBDIRS); do \ echo "\nCleaning directory $$dir"; \ $(MAKE) -C $$dir clean; \ done ``` 这个makefile中,首先定义了项目的根目录路径SRC_DIR和子目录列表SUBDIRS。然后,定义了编译器和编译选项。 接着,我们定义了三个规则。all规则是默认目标,它依赖于子目录规则$(SUBDIRS)。$(SUBDIRS)规则中会递归地调用子目录下的makefile文件,来编译子目录的源文件。 clean规则用于清理所有子目录编译结果。 最后,我们使用通配符来遍历每个子目录,并在每个子目录中调用适当的规则。 通过执行`make`命令,makefile编译所有子目录下的源文件。执行`make clean`命令,makefile会清理所有子目录编译结果。 ### 回答3: 在Makefile编译子目录,可以使用以下代码示例: ```makefile # 定义子目录列表 SUBDIRS := dir1 dir2 dir3 # 递归编译子目录 .PHONY: subdirs $(SUBDIRS) subdirs: $(SUBDIRS) $(SUBDIRS): $(MAKE) -C $@ # 默认目标,编译所有子目录 all: subdirs ``` 以上代码中,`SUBDIRS`变量定义了子目录列表,可以根据需要修改。然后,使用`.PHONY`伪目标设定`subdirs`目标,并添加`$(SUBDIRS)`作为该目标的依赖。 接下来,为`$(SUBDIRS)`中的每个子目录设置规则。在每个子目录上使用`$(MAKE) -C $@`命令执行该子目录Makefile。这将递归地进入每个子目录编译其内容。 最后,将`subdirs`目标添加到默认目标`all`中。在终端中运行`make all`命令将编译所有子目录。 这样,通过在Makefile中使用递归目录编译子目录的方法,可以方便地管理复杂的项目结构并进行编译
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值