模板一:
源文件,.h个在一个文件夹下生成可执行文件:
DIR_INC = ./include
DIR_SRC = ./src
DIR_OBJ = ./obj
DIR_BIN = ./lib
DIR_PUB = ./pub
DLIBS = -O2 -Wall
SRC = $(wildcard ${DIR_SRC}/*.c)
OBJ = $(patsubst %.c,${DIR_OBJ}/%.o,$(notdir ${SRC}))
TARGET = xxx
BIN_TARGET = ${DIR_BIN}/${TARGET}
CC = gcc
CFLAGS = -I${DIR_INC}
${BIN_TARGET}:${OBJ}
$(CC) -o $@ $(OBJ) $(DLIBS)
${DIR_OBJ}/%.o:${DIR_SRC}/%.c
$(info, $(CFLAGS))
@echo $(CFLAGS)
$(CC) $(CFLAGS) -c -g $< -o $@
.PHONY:clean
clean:
rm -rf ${DIR_OBJ}/*.o ${BIN_TARGET}
模板二:
源文件,.h个在一个文件夹下生成静态库:
DIR_INC = ./include
DIR_SRC = ./src
DIR_OBJ = ./obj
DIR_BIN = ./lib
DIR_PUB = ./pub
SRC = $(wildcard ${DIR_SRC}/*.c)
OBJ = $(patsubst %.c,${DIR_OBJ}/%.o,$(notdir ${SRC}))
TARGET = xxx.a
BIN_TARGET = ${DIR_BIN}/${TARGET}
CC = gcc
AR = ar
CFLAGS = -I${DIR_INC}
${BIN_TARGET}:${OBJ}
$(AR) -crv $@ $(OBJ)
${DIR_OBJ}/%.o:${DIR_SRC}/%.c
$(info, $(CFLAGS))
@echo $(CFLAGS)
$(CC) $(CFLAGS) -c -g $< -o $@
.PHONY:clean
clean:
rm -rf ${DIR_OBJ}/*.o ${BIN_TARGET}
模板三:
源文件,.h个在多个文件夹下生成可执行文件:
DIR_INC1 = ../
DIR_INC2 = .
DIR_SRC1 = ../
DIR_SRC2 = .
DIR_OBJ = ./obj
DIR_BIN = .
DLIBS = -O2 -Wall
SRC = $(wildcard ${DIR_SRC1}/*.c) $(wildcard ${DIR_SRC2}/*.c)
OBJ = $(patsubst %.c,${DIR_OBJ}/%.o,$(notdir ${SRC}))
TARGET = xxx
BIN_TARGET = ${DIR_BIN}/${TARGET}
CC = gcc
CFLAGS = -I${DIR_INC}
${BIN_TARGET}:${OBJ}
$(CC) -o $@ $(OBJ) $(DLIBS)
${DIR_OBJ}/%.o:${DIR_SRC1}/%.c
$(CC) $(CFLAGS) -c $< -o $@
${DIR_OBJ}/%.o:${DIR_SRC2}/%.c
$(CC) $(CFLAGS) -c $< -o $@
.PHONY:clean
clean:
rm -rf ${DIR_OBJ}/*.o ${BIN_TARGET}