Makefile 多目录自动编译
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Makefile 多目录自动编译相关的知识,希望对你有一定的参考价值。
适用于多目录结构 C 工程自动编译。
makefile 分成三类:
1. 工程根目录 makefile : 这个makefile执行分成两个阶段
a)递归进入每个子目录, 逐个执行子目录里面的 makefile ,将所有子目录里面生成的 .o 文件统一放在 /debug/obj (debug 子目录比较特殊 在第一阶段需要将这个子目录排除在外)
b)执行 debug 子目录下面的 makefile 将第一阶段生成在 /debug/obj 里面的 .o 文件连接成可执行文件
2. 子目录 makefile : 每个源代码文件夹里面都必须包含此文件
这个makefie 将把当前目录下面的所有 .c 源文件编译一遍 并将生成的 .o文件 放在 debug/obj 目录下
3. debug 目录 makefile : 这个 makefile 将debug/obj 里面的 .o 文件连接生成可执行文件 放在debug/bin 目录下
下面给出每类makefile的参考代码
1. 根目录 makefile
需要注意的是以下第 9 行的 CFLAG 变量 : 这个变量指定了编译条件 比如 -I$(ROOT_DIR)/common 指连接根目录下面的 common 文件夹 (参考gcc -I 选项),不然可能会编译报错缺少头文件,根据自己工程的目录结构可以在后面无限增加; -Wall 打开所有编译警告。
1 CC=gcc 2 SUBDIRS=$(shell ls -l | grep ^d | awk ‘{if($$9 != "debug") print $$9}‘) 3 ROOT_DIR=$(shell pwd) 4 BIN=a.out 5 OBJS_DIR=debug/obj 6 BIN_DIR=debug/bin 7 CUR_SOURCE=${wildcard *.c} 8 CUR_OBJS=${patsubst %.c, %.o, $(CUR_SOURCE)} 9 CFLAG = -I$(ROOT_DIR)/common -I$(ROOT_DIR)src -Wall 10 export CC BIN OBJS_DIR BIN_DIR ROOT_DIR CFLAG 11 all:$(SUBDIRS) $(CUR_OBJS) DEBUG 12 $(SUBDIRS):ECHO 13 make -C [email protected] 14 DEBUG:ECHO 15 make -C debug 16 ECHO: 17 @echo $(SUBDIRS) 18 $(CUR_OBJS):%.o:%.c 19 $(CC) -c $^ -o $(ROOT_DIR)/$(OBJS_DIR)/[email protected] 20 clean: 21 @rm $(OBJS_DIR)/*.o 22 @rm -rf $(BIN_DIR)/*
2. 子目录 makefile
1 SUBDIRS=$(shell ls -l | grep ^d | awk ‘{print $$9}‘) 2 CUR_SOURCE=${wildcard *.c} 3 CUR_OBJS=${patsubst %.c, %.o, $(CUR_SOURCE)} 4 all:$(SUBDIRS) $(CUR_OBJS) 5 $(SUBDIRS):ECHO 6 make -C [email protected] 7 $(CUR_OBJS):%.o:%.c 8 $(CC) -c $^ -o $(ROOT_DIR)/$(OBJS_DIR)/[email protected] $(CFLAG) 9 ECHO: 10 @echo $(SUBDIRS)
3. debug 目录makefile
1 OBJS = *.o 2 ODIR = obj 3 $(ROOT_DIR)/$(BIN_DIR)/$(BIN):$(ODIR)/$(OBJS) 4 $(CC) -o [email protected] $^
要看懂这个makefile 需要了解一定的makefile 语法基础,推荐参考 GUN_make中文手册
最后,如果发现错误,请批评指正,相互学习。
以上是关于Makefile 多目录自动编译的主要内容,如果未能解决你的问题,请参考以下文章
Linux系统开发工具(下) {调试器gdb,自动化构建工具make/Makefile,多文件编译,代码管理平台git}