# 编译器和标志 CXX = g++ CXXFLAGS = -Wall -std=c++17 -I./ -I./3rd -I./net -I./ofen/include -I./util # 添加 3rd 目录的头文件路径 # 目录 SRCDIR = src OBJDIR = obj BINDIR = bin LIBDIR = lib THIRDDIR = 3rd # 库路径和库文件 LIB_PATHS = -L$(LIBDIR) -L$(THIRDDIR)/lib # 假设 3rd 下有一些库文件 LIBS = -lws2_32 -lwsock32 # 源文件 UTIL_SRC = $(wildcard util/*.cpp) NET_SRC = $(wildcard net/*.cpp) OFEN_SRC = $(wildcard ofen/src/*.cpp) CLIENT_SRC = $(wildcard client/*.cpp) SERVER_SRC = $(wildcard server/*.cpp) # 对应的目标文件 UTIL_OBJ = $(UTIL_SRC:%.cpp=$(OBJDIR)/%.o) NET_OBJ = $(NET_SRC:%.cpp=$(OBJDIR)/%.o) OFEN_OBJ = $(OFEN_SRC:%.cpp=$(OBJDIR)/%.o) CLIENT_OBJ = $(CLIENT_SRC:%.cpp=$(OBJDIR)/%.o) SERVER_OBJ = $(SERVER_SRC:%.cpp=$(OBJDIR)/%.o) # 库文件 UTIL_LIB = $(LIBDIR)/libutil.a NET_LIB = $(LIBDIR)/libnet.a OFEN_LIB = $(LIBDIR)/libofen.a # 可执行文件 CLIENT_BIN = $(BINDIR)/client SERVER_BIN = $(BINDIR)/server # 生成的目标文件夹 $(shell mkdir -p $(OBJDIR) $(BINDIR) $(LIBDIR)) # 默认目标:编译所有目标 all: $(CLIENT_BIN) $(SERVER_BIN) # 生成 util 库 $(UTIL_LIB): $(UTIL_OBJ) ar rcs $@ $^ # 生成 net 库 $(NET_LIB): $(NET_OBJ) ar rcs $@ $^ # 生成 ofen 库 $(OFEN_LIB): $(OFEN_OBJ) ar rcs $@ $^ # 生成 client 可执行文件 $(CLIENT_BIN): $(CLIENT_OBJ) $(UTIL_LIB) $(NET_LIB) $(OFEN_LIB) $(CXX) -o $@ $^ $(CXXFLAGS) $(LIB_PATHS) $(LIBS) # 生成 server 可执行文件 $(SERVER_BIN): $(SERVER_OBJ) $(UTIL_LIB) $(NET_LIB) $(OFEN_LIB) $(CXX) -o $@ $^ $(CXXFLAGS) $(LIB_PATHS) $(LIBS) # 编译 .cpp 文件为 .o 文件 $(OBJDIR)/%.o: %.cpp $(CXX) -c -o $@ $< $(CXXFLAGS) # 清理生成的文件 clean: rm -rf $(OBJDIR) $(BINDIR) $(LIBDIR) # 只编译可执行文件 .PHONY: all clean