我写了一个小项目通用makefile,方便使用
#编译条件
#1.是否调试编译,true为调试模式 false为发布模式
DEBUG := false
#2.c为C语言 cpp为C++语言
C_CPP:= c
#设置目录
DIR_INC := inc
DIR_SRC := src
DIR_OUT := build
#设置文件后缀名
ifeq ($(C_CPP),c)
FILE_C := c
CC := gcc
else
FILE_C := cpp
CC := g++
endif
FILE_H := h
FILE_CPP := cpp
FILE_OUT := o
#编译工具及选项
CFLAGS := -I $(DIR_INC)
LDFLAGS :=
ifeq ($(DEBUG),true)
CFLAGS += -g
endif
#tools
MKDIR := mkdir
RM := rm -rf
#文件定义
SRCS := $(wildcard $(DIR_SRC)/*.$(FILE_C))
INCS := $(wildcard $(DIR_INC)/*.$(FILE_H))
NODIR_OBJS:=$(notdir $(SRCS:.$(FILE_C)=.$(FILE_OUT)))
OBJS := $(patsubst $(DIR_SRC)%,$(DIR_OUT)%,$(SRCS:.$(FILE_C)=.$(FILE_OUT)))
TARGET := $(DIR_OUT)/app.out
#自动搜索路径
vpath %.$(FILE_C) $(DIR_SRC)
vpath %.$(FILE_H) $(DIR_INC)
vpath %.$(FILE_OUT) $(DIR_OUT)
.PHONY : all clean rebuild run
all : $(DIR_OUT) $(TARGET)
$(DIR_OUT) :
@$(MKDIR) $@
@echo "output file dir is created ... :$(CURDIR)/$@"
$(TARGET) : $(OBJS)
$(CC) $(LDFLAGS) -o $@ $^
@echo "dest file is : $@ ,compile finished ..."
@./$@
$(DIR_OUT)/%.o : %.c $(INCS)
$(CC) $(CFLAGS) -o $@ -c $<
clean :
@$(RM) $(DIR_OUT)
@echo "clean finished ..."
rebuild : clean all
@echo "rebuilded finished ..."
run : all
@echo "running ..."
@./$(TARGET)