TARGET := test
CC := g++
#注意每行后面不要有空格,否则会算到目录名里面,导致问题
SRC_DIR = src
BUILD_DIR = tmp
OBJ_DIR = $(BUILD_DIR)/obj
DEPS_DIR = $(BUILD_DIR)/deps
#这里添加其他头文件路径
INC_DIR = \
-I./include
#这里添加编译参数
CC_FLAGS := $(INC_DIR) -g
#查找src_dir下面包含子目录的所有cpp文件
SOURCES = $(foreach dir, $(SRC_DIR), $(wildcard $(dir)/*.cpp))
OBJS = $(addprefix $(OBJ_DIR)/,$(patsubst %.cpp,%.o,$(notdir $(SOURCES))))
DEPS = $(addprefix $(DEPS_DIR)/, $(patsubst %.cpp,%.d,$(notdir $(SOURCES))))
$(TARGET):$(OBJS)
$(CC) $^ -o $@
#编译之前要创建OBJ目录,确保目录存在
$(OBJ_DIR)/%.o:$(SRC_DIR)/%.cpp
if [ ! -d $(OBJ_DIR) ]; then mkdir -p $(OBJ_DIR); fi;\
$(CC) -c $(CC_FLAGS) -o $@ $<
#编译之前要创建DEPS目录,确保目录存在
#前面加@表示隐藏命令的执行打印
$(DEPS_DIR)/%.d:$(SRC_DIR)/%.cpp
@if [ ! -d $(DEPS_DIR) ]; then mkdir -p $(DEPS_DIR); fi;\
set -e; rm -f $@;\
$(CC) -MM $(CC_FLAGS) $< > $@.$$$$;\
sed 's,\($*\)\.o[ :]*,$(OBJ_DIR)/\1.o $@ : ,g' < $@.$$$$ > $@;\
rm -f $@.$$$$
#前面加-表示忽略错误
-include $(DEPS)
.PHONY : clean
clean:
rm -rf $(BUILD_DIR) $(TARGET)
最终目录结构是这个样子,tmp存放了所有中间文件, 源码在src目录。
直接在根目录执行make就可以了。
root@ubuntu:~/projects/MakeFileProject1# tree . . ├── makefile ├── src │ └── main.cpp ├── test └── tmp ├── deps │ └── main.d └── obj └── main.o