Makefile模板

CC = gcc
LD = $(CC)

TARGET = $(notdir $(CURDIR))

SRC_DIR = .
INCLUDE_DIR += .

C_FLAGS = -g -Wall
LD_FLAFS =
LD_LIBS =
INCLUDES = -I$(INCLUDE_DIR)

ifeq ($(CC), g++)
    TYPE = cpp
    SRCS += $(wildcard $(SRC_DIR)/*.$(TYPE))
    OBJS += $(patsubst %.$(TYPE), %.o, $(SRCS))
else
    TYPE = c
    SRCS += $(wildcard $(SRC_DIR)/*.$(TYPE))
    OBJS += $(patsubst %.$(TYPE), %.o, $(SRCS))
endif

all : $(TARGET)
    @echo "Builded target:" $^
    @echo "Done"

$(TARGET) : $(OBJS)
    @echo "Linking" $@ "from" $^ "..."
    $(LD) -o $@ $^ $(LD_FLAGS) $(LD_LIBS)
    @echo "Link finished\n"

$(OBJS) : %.o:%.$(TYPE)
    @echo "Compiling" $@ "from" $< "..."
    $(CC) -c -o $@ $< $(C_FLAGS) $(INCLUDES)
    @echo "Compiled finished\n"

.PHONY : clean cleanobj
clean : cleanobj
    @echo "Remove all executable file"
    rm -f $(TARGET)
cleanobj :
    @echo "Remove binary files"
    rm -f *.o

用法

编译C程序:

make

编译C++程序:

make CC=g++

其他

TARGET指定生成的可执行文件名
SRC_DIR指定源文件(.c .cpp)文件的路径
INCLUDE_DIR指定头文件路径
C_FLAGS指定编译参数选项
LD_FLAFS指定链接参数选项
LD_LIBS =指定链接库

清除生成的文件:

# 清空全部生成文件
make clean
# 清空生成的中间文件
make cleanobj
02-14 01:42