单个makefile构建多目录的工程

单makefile 构建多个目录的工程适用于构建稍微复杂一些的工程
目录树如下


➜  test_pro2 tree -h   
.
├── [4.0K]  app_1
│   ├── [ 272]  app1.c
│   └── [ 225]  app1.h
├── [4.0K]  app_2
│   ├── [ 270]  app2.c
│   └── [ 226]  app2.h
├── [ 334]  app_main.c
└── [1.0K]  makefile

2 directories, 6 files

makefile 文件

ROOT_DIR = $(shell pwd)
APP_1_DIR = $(ROOT_DIR)/app_1
APP_2_DIR = $(ROOT_DIR)/app_2


SRC_DIR := $(ROOT_DIR) \
			$(APP_1_DIR) \
			$(APP_2_DIR)

INC_DIR := $(APP_1_DIR) \
		$(APP_2_DIR)


SRC = $(foreach dir, $(SRC_DIR), $(wildcard $(dir)/*.c))                   # 获取当前目录下的所有.c文件
OBJ := $(patsubst %.c, %.o, $(SRC))     # 将所有的.c文件换成.o文件
# OBJ = $(SRC:.cc=.o)


EXEC = test_app.bin


DFLAGS ?=                               # 库的链接参数
CFLAGS := $(patsubst %, -I %, $(INC_DIR))   # 参数信息
CROSS_COMPILE ?=                        # 没有定义交叉编译器时,直接用gcc


CC := $(CROSS_COMPILE)gcc               # 编译器 按需就行
AR = ${CROSS_COMPILE}ar
STRIP = ${CROSS_COMPILE}strip
AS = ${CROSS_COMPILE}as
LD = ${CROSS_COMPILE}lr
RANLIB = ${CROSS_COMPILE}ranlib
NM = ${CROSS_COMPILE}nm


.PHONY : clean all
all: $(EXEC)

$(info will make project)

$(EXEC): $(OBJ)
	$(CC) $(OBJ) -o $@ $(CFLAGS) $(DFLAGS)

%.o: %.c
	$(CC) -c $< -o $@ $(CFLAGS) $(DFLAGS)

clean:
	rm -rf $(OBJ) $(EXEC)

测试

➜  test_pro2 make clean all
will make project
rm -rf  /home/zw/test_pro/test_pro2/app_main.o  /home/zw/test_pro/test_pro2/app_1/app1.o  /home/zw/test_pro/test_pro2/app_2/app2.o      test_app.bin
gcc                -c /home/zw/test_pro/test_pro2/app_main.c -o /home/zw/test_pro/test_pro2/app_main.o  -I /home/zw/test_pro/test_pro2/app_1  -I /home/zw/test_pro/test_pro2/app_2    
gcc                -c /home/zw/test_pro/test_pro2/app_1/app1.c -o /home/zw/test_pro/test_pro2/app_1/app1.o  -I /home/zw/test_pro/test_pro2/app_1  -I /home/zw/test_pro/test_pro2/app_2    
gcc                -c /home/zw/test_pro/test_pro2/app_2/app2.c -o /home/zw/test_pro/test_pro2/app_2/app2.o  -I /home/zw/test_pro/test_pro2/app_1  -I /home/zw/test_pro/test_pro2/app_2    
gcc                 /home/zw/test_pro/test_pro2/app_main.o  /home/zw/test_pro/test_pro2/app_1/app1.o  /home/zw/test_pro/test_pro2/app_2/app2.o      -o test_app.bin  -I /home/zw/test_pro/test_pro2/app_1  -I /home/zw/test_pro/test_pro2/app_2    
➜  test_pro2 ./test_app.bin 
main in 
app1_init in 
app2_init in 
➜  test_pro2 
posted @ 2023-01-04 14:01  tccxy  阅读(117)  评论(0编辑  收藏  举报