单个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