推荐:非常详尽的Makefile教程(链接)。
需求:
1、指定源代码目录./src,编译目录下所有.cpp文件;
2、指定目标文件目录./obj,存放编译生成的.obj文件;
3、.cpp文件名唯一,根据cpp文件名自动确定.o文件名。
实现(WSL-ubuntu 18.04):
1、获取源代码目录下源文件名:SRC = $(wildcard $(SRC_DIR)/*.cpp)
2、字符串替换获取目标文件名:OBJECTS = $(patsubst $(SRC_DIR)/%.cpp, %.o, $(SRC))
3、指定源代码默认搜索路径:VPATH = $(SRC_DIR)。如果不指定VPATH,需要在目标文件生成规则指定路径:
4、连接时为目标文件增加目录路径。
5、vpath %.o $(OBJ_DIR),避免每次make全量重新编译。
完整的 Makefile:
CC = g++
CFLAGS = -lpthread
TARGET = app
OBJ_DIR = ./obj
SRC_DIR = ./src
SRC = $(wildcard $(SRC_DIR)/*.cpp)
OBJECTS = $(patsubst $(SRC_DIR)/%.cpp, %.o, $(SRC))
VPATH = $(SRC_DIR)
vpath %.o $(OBJ_DIR)
all: $(TARGET)
$(TARGET) : $(OBJECTS)
$(CC) -o $@ $(addprefix $(OBJ_DIR)/, $(OBJECTS)) $(CFLAGS)
%.o : %.cpp
$(CC) -c $< -o $(OBJ_DIR)/$@
.PHONY : clean
clean:
rm -rf $(TARGET) $(OBJ_DIR)/*.o ./*.o