首先,目录结构:
其中根目录Makefile主要作用是调用其他子文件夹Makefile,每个子模块执行各自编译后在build文件夹下生成obj文件,最后再执行build文件夹下Makefile进行链接。
根目录Makefile:
TARGET = ACT_Drv
##
SRC_DIR=src
BUILD_DIR=build
LIB_DIR=lib
INTERFACE_DIR = $(SRC_DIR)/Interface
ACT_DRIVER_DIR = $(SRC_DIR)/Act_Driver
CURRENT_DIR =$(SRC_DIR)/Current_Loop
##
CC=gcc
all:
make -C $(ACT_DRIVER_DIR)
make -C $(CURRENT_DIR)
make -C $(INTERFACE_DIR)
make -C $(BUILD_DIR)
任意子文件夹Makefile:
OUTPUTDIR = ../../build
TARGET = $(OUTPUTDIR)/Current_Loop.o
CC := gcc
SRC = $(wildcard *.c)
OBJ = $(patsubst %.c,$(OUTPUTDIR)/%.o,$(notdir $(SRC)))
$(TARGET):$(SRC)
$(CC) -c $< -o $@
以其中一个为例,SRC通过wildcard *.c查找所有c文件,然后通过patsubst讲*.c替换为.o文件,而后通过notdir去掉路径后将obj文件放到../../build文件夹。
$@目标文件
$< 第一个依赖项
$^所有依赖
-c仅编译不链接。因为有的文件是需要其他模块功能,有的还需要进行动\静态库链接,这里先编译等到最后得到全部obj文件后再链接。如果需要头文件可以通过-I../inc指定包含目录。
每个子模块通过上面Makefile文件进行编译后得到obj文件,最后通过一个Makefile进行链接:
TARGET = ../ACT_Drv
CC := gcc
OBJ = $(wildcard *.o)
LIBS = -L../lib -lACTS2200_64
$(TARGET):$(OBJ)
$(CC) $^ -o $@ $(LIBS)
-L指定文件夹 -l库名