diff --git a/.vscode/settings.json b/.vscode/settings.json
index c836560..6710153 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -132,5 +132,6 @@
         "random": "cpp",
         "cinttypes": "cpp",
         "regex": "cpp"
-    }
+    },
+    "makefile.configureOnOpen": false
 }
\ No newline at end of file
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..f69512c
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,74 @@
+# 编译器和标志
+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
diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt
index b774a32..fe805a0 100644
--- a/client/CMakeLists.txt
+++ b/client/CMakeLists.txt
@@ -4,7 +4,6 @@ project(transmc LANGUAGES CXX)
 set(CMAKE_CXX_STANDARD 17)
 
 if (MSVC)
-    add_definitions(-D_WIN32_WINNT=0x0601)
     add_compile_options(/source-charset:utf-8)
 endif()
 
diff --git a/client/client.cpp b/client/client.cpp
index 0d6c19d..6535b9c 100644
--- a/client/client.cpp
+++ b/client/client.cpp
@@ -1,12 +1,18 @@
 #include "client.h"
-#include <filesystem>
 #include <fstream>
 #include <iostream>
 #include <of_path.h>
 #include <of_str.h>
 #include <of_util.h>
 
+#ifdef USE_BOOST_FILESYSTEM
+#include <boost/filesystem.hpp>
+namespace fs = boost::filesystem;
+#else
+#include <filesystem>
 namespace fs = std::filesystem;
+#endif
+
 CClient::CClient(const std::shared_ptr<spdlog::logger>& logger) : logger_(logger)
 {
     client_ = std::make_shared<CTcpClient>(io_context_, logger_);
diff --git a/client/main.cpp b/client/main.cpp
index 9bd006d..4bff7b6 100644
--- a/client/main.cpp
+++ b/client/main.cpp
@@ -1,12 +1,18 @@
 #include "client.h"
 #include "version.h"
 #include <SimpleIni.h>
-#include <filesystem>
 #include <iostream>
 #include <of_path.h>
 
 using namespace ofen;
+
+#ifdef USE_BOOST_FILESYSTEM
+#include <boost/filesystem.hpp>
+namespace fs = boost::filesystem;
+#else
+#include <filesystem>
 namespace fs = std::filesystem;
+#endif
 
 struct TransmSet {
     std::string ip{};
diff --git a/net/CMakeLists.txt b/net/CMakeLists.txt
index 9f240de..c654387 100644
--- a/net/CMakeLists.txt
+++ b/net/CMakeLists.txt
@@ -3,7 +3,6 @@ cmake_minimum_required(VERSION 3.16)
 project(trans_net LANGUAGES CXX)
 
 if (MSVC)
-    add_definitions(-D_WIN32_WINNT=0x0601)
     add_compile_options(/source-charset:utf-8)
 endif()
 
diff --git a/ofen b/ofen
index 1e83e39..8b2905d 160000
--- a/ofen
+++ b/ofen
@@ -1 +1 @@
-Subproject commit 1e83e393eb2ee59d05690a7c39bf807c994560b2
+Subproject commit 8b2905dadc30a1a7351953b7130f83cff39b69b1