MinGW for Win64 入门:轻量级 C++ 编译环境搭建与实战

简介:MinGW for Win64 是面向 Windows 64 位平台的 GCC 编译器工具链资源,适合在本地学习 C++、希望摆脱大型 IDE 依赖的开发者与编程初学者。它提供命令行编译环境,可快速完成代码编译与调试,帮助理解从源码到可执行文件的完整过程。压缩包为 zip 格式,整体约 156.05MB,包内以 GCC 编译器、libstdc++ 标准库、Binutils 链接与汇编工具、Make 构建工具及配套头文件和库为主,覆盖 C++11/14/17 标准支持,并包含部分 C++20 特性。资源中的 TDM-GCC-64 是 MinGW 分支,针对 64 位系统优化,集成较新的 GCC 版本与库,便于生成和运行 64 位应用程序。目前已有 115 人学习下载,适合需要轻量级、跨平台兼容编译环境的 C++ 学习者参考使用。

1. 为什么我劝你先别急着装 Visual Studio,试试 MinGW for Win64

如果你在 Windows 上写 C++,大概率经历过这样的场景:只是想编译一个单文件的小工具,或者跑通某个开源库的示例,结果被要求先下载一个几十 GB 的 IDE,装完还要配置一堆环境变量,最后发现命令行里敲g++依然提示“不是内部或外部命令”。这种体验对新手极不友好,对老手也是时间浪费。MinGW for Win64 就是冲着这个痛点来的——它把 GCC 工具链(g++、gcc、gdb、make 等)打包成一套能在 64 位 Windows 上直接运行的命令行工具,解压、配路径、敲命令,三步就能把.cpp变成.exe。它适合谁?适合想快速验证 C++ 代码片段的人、需要轻量级编译环境的教学场景、以及不想被 IDE 绑定、习惯用 VS Code 或终端写代码的开发者。这一篇不聊虚的,直接拆这套工具怎么落地、参数怎么调、哪些坑我替你踩过了。

2. MinGW for Win64 里到底装了什么:工具链构成与选型逻辑

2.1 核心组件拆解:g++、gcc、gdb、mingw32-make 各管什么

MinGW 全称 Minimalist GNU for Windows,本质是把 GNU 工具链移植到 Windows 上,生成的是原生 Windows 可执行文件,不依赖第三方运行时。Win64 版本意味着它编译出的是 64 位程序,能直接调用系统 API,也能链接大多数为 Windows 编译的静态库。一套典型的 MinGW for Win64 包里,你会看到这几个关键角色:

  • gcc.exe:C 编译器,处理.c文件。
  • g++.exe:C++ 编译器,处理.cpp、.cc、.cxx,自动链接 C++ 标准库。
  • gdb.exe:调试器,配合 VS Code 或命令行做断点调试。
  • mingw32-make.exe:GNU make 的 Windows 移植版,用来跑 Makefile。
  • windres.exe:资源编译器,把.rc文件编译成.o,用于给 exe 加图标、版本信息。
  • ar.exe、ranlib.exe:静态库打包工具。

这些工具全部放在bin目录下,配好 PATH 之后在任意终端都能调用。和 MSVC 的区别在于,MinGW 用的是 GNU 那套语法和链接规则,很多 Linux 下的开源项目改都不用改就能编译,这是它最大的价值。

2.2 为什么选 MinGW 而不是 MSVC 或 WSL

选型这件事没有绝对优劣,只有场景匹配。我一般会按下面这张表来判断:

场景推荐工具理由
编译 Linux 移植过来的开源库MinGW兼容 GNU 语法和 Makefile,改动最少
开发 Windows 原生 GUI 程序MSVC对 Win32 API 和 MFC 支持最完整
需要完整 Linux 环境WSL系统调用和包管理完全一致
快速验证 C++ 代码片段MinGW解压即用,无需安装,体积小
教学演示编译过程MinGW命令行输出清晰,不隐藏细节

MinGW 的短板也很明显:它不提供 Windows SDK 的完整头文件,某些只针对 MSVC 的库(比如部分 DirectX 组件)链接会报错;调试信息格式是 DWARF 而非 PDB,和某些 Windows 调试工具配合不好。但如果你主要写标准 C++、用开源库、跑算法题或小工具,这些短板基本碰不到。

2.3 版本选择:posix 线程模型与 sjlj/seh 异常处理的区别

下载 MinGW for Win64 时,你会看到文件名里带posix、win32、sjlj、seh这些词,它们决定了运行时行为:

  • 线程模型:posix支持 C++11 的std::thread和std::mutex,win32不支持。如果你用多线程,必须选 posix。
  • 异常处理:seh是 Windows 原生结构化异常处理,性能好,支持 64 位;sjlj是旧式 setjmp/longjmp 方案,性能差但兼容性好。64 位下优先选 seh。
  • 版本号:GCC 版本越高,支持的 C++ 标准越新。写 C++17/20 代码就选 GCC 11 以上。

所以一个合理的文件名类似x86_64-posix-seh-gcc-13.2.0。如果你不确定,就选 posix + seh + 较新 GCC 的组合,这是目前最通用的配置。

3. 从零跑通第一个 C++ 程序:解压、配 PATH、编译、调试

3.1 解压与目录规划:别放在带空格和中文的路径下

下载下来的通常是一个.7z或.zip压缩包,解压后得到一个类似mingw64的文件夹。我习惯把它放到C:\mingw64,原因有三:路径短,命令行里好敲;没有空格,避免 Makefile 和脚本解析出错;没有中文,防止某些工具链对编码处理不一致。

解压后目录结构大致如下:

C:\mingw64 ├── bin # 可执行文件,要加入 PATH ├── include # 头文件 ├── lib # 静态库和动态库 ├── libexec # 内部工具 └── share # 文档和许可证

注意:不要放在C:\Program Files下,空格会导致部分构建脚本失败;也不要放在桌面或文档目录,中文用户名路径同样会引发玄学问题。

3.2 配置环境变量:PATH 加对了,g++ 才认你

把C:\mingw64\bin加入系统 PATH。操作步骤:

  1. 按Win + R,输入sysdm.cpl,回车。
  2. 切换到“高级”选项卡,点击“环境变量”。
  3. 在“系统变量”里找到Path,双击,新建一行,填入C:\mingw64\bin。
  4. 一路确定,关闭所有终端,重新打开一个。

验证是否成功:

g++ --version

如果输出类似g++ (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 13.2.0,说明配置正确。如果提示“不是内部或外部命令”,检查 PATH 是否写错,或者终端没重启。

3.3 编译第一个文件:一条命令背后的四个阶段

新建hello.cpp:

#include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> nums = {3, 1, 4, 1, 5, 9, 2, 6}; std::sort(nums.begin(), nums.end()); for (int n : nums) { std::cout << n << " "; } std::cout << std::endl; return 0; }

编译命令:

g++ -std=c++17 -Wall -Wextra -O2 -o hello.exe hello.cpp

参数说明:

  • -std=c++17:指定 C++ 标准,可选 c++11/14/17/20。
  • -Wall -Wextra:开启常用警告,帮你发现潜在问题。
  • -O2:优化级别,发布时用;调试时换成-g -O0。
  • -o hello.exe:指定输出文件名。

这条命令背后走了四个阶段:预处理(展开头文件和宏)、编译(生成汇编)、汇编(生成目标文件.o)、链接(合并库和启动代码,生成.exe)。想只看某个阶段,可以用-E、-S、-c分别停在预处理、汇编、目标文件。

运行:

./hello.exe

输出1 1 2 3 4 5 6 9,第一个程序就跑通了。

3.4 用 gdb 做命令行调试:断点、单步、看变量

编译时加-g生成调试信息:

g++ -g -O0 -std=c++17 -o hello_dbg.exe hello.cpp

启动 gdb:

gdb hello_dbg.exe

常用命令:

(gdb) break main # 在 main 函数入口下断点 (gdb) run # 运行程序 (gdb) next # 单步执行,不进入函数 (gdb) step # 单步执行,进入函数 (gdb) print nums # 打印变量值 (gdb) continue # 继续运行到下一个断点 (gdb) quit # 退出

如果 gdb 启动时报错缺少libintl-8.dll或类似动态库,说明bin目录没在 PATH 里,或者解压不完整。重新检查 PATH 和文件完整性即可。

4. 多文件项目与 Makefile:让 mingw32-make 替你管编译

4.1 手动编译多文件的痛点:命令越来越长

当项目变成main.cpp、utils.cpp、utils.h、logger.cpp、logger.h时,手动敲命令会变成:

g++ -std=c++17 -Wall -O2 -o app.exe main.cpp utils.cpp logger.cpp

文件一多,改一个文件就要全量重编,浪费时间;依赖关系靠脑子记,容易漏。这时候需要 make。

4.2 写一个能跑的 Makefile:变量、目标、依赖

在项目根目录新建Makefile:

# 编译器与参数 CXX := g++ CXXFLAGS := -std=c++17 -Wall -Wextra -O2 TARGET := app.exe SRCS := main.cpp utils.cpp logger.cpp OBJS := $(SRCS:.cpp=.o) # 默认目标 all: $(TARGET) # 链接 $(TARGET): $(OBJS) $(CXX) $(CXXFLAGS) -o $@ $^ # 编译每个 .cpp 到 .o %.o: %.cpp $(CXX) $(CXXFLAGS) -c $< -o $@ # 清理 clean: del /Q $(OBJS) $(TARGET) 2>nul .PHONY: all clean

关键点:

  • $(SRCS:.cpp=.o)把源文件列表转成目标文件列表。
  • $@表示目标名,$^表示所有依赖,$<表示第一个依赖。
  • Windows 下清理命令用del /Q,2>nul忽略文件不存在时的报错。
  • 命令行前必须是 Tab,不能是空格,这是 Makefile 最常见的翻车点。

运行:

mingw32-make

它会自动判断哪些.o过期,只重编改动的文件,然后链接。清理用:

mingw32-make clean

4.3 链接静态库与动态库:-L、-l、-I 的正确姿势

假设你有一个第三方库mylib,头文件在include,库文件在lib,静态库叫libmylib.a,动态库叫mylib.dll。

编译时指定头文件路径:

g++ -std=c++17 -I./include -c main.cpp -o main.o

链接时指定库路径和库名:

g++ -o app.exe main.o -L./lib -lmylib

参数说明:

  • -I:头文件搜索路径,后面跟目录。
  • -L:库文件搜索路径,后面跟目录。
  • -l:库名,去掉lib前缀和.a/.dll后缀。比如libmylib.a写成-lmylib。
  • 静态库链接后 exe 体积大但独立;动态库需要把.dll放到 exe 同目录或系统 PATH 下,否则运行时报“找不到 xxx.dll”。

如果链接报undefined reference to ...,先检查库名拼写和顺序——GCC 链接顺序从左到右,依赖别人的库要放在后面。

5. 避坑与排查:这五类问题我几乎每次都能遇到

5.1 现象:编译报 “fatal error: iostream: No such file or directory”

原因:g++找不到 C++ 标准库头文件,通常是 PATH 配错,或者误把gcc当g++用。gcc默认不链接 C++ 标准库,编译.cpp时不会自动加 C++ 头文件路径。

解决:确认用的是g++而不是gcc;检查C:\mingw64\bin是否在 PATH 最前面;运行g++ -v看搜索路径里有没有include/c++目录。

5.2 现象:链接报 “undefined reference tostd::cout”

原因:用gcc编译了 C++ 文件,或者手动指定了-lc但没指定-lstdc++。

解决:统一用g++编译和链接。如果必须用gcc,在链接命令末尾加-lstdc++。

5.3 现象:程序运行闪退,或者双击 exe 没反应

原因:动态库缺失,或者程序在等待输入但窗口瞬间关闭。

解决:在命令行里运行 exe,看报错信息;用ldd app.exe(MinGW 自带)检查依赖的 dll 是否都在;如果是控制台程序,在main末尾加system("pause")或从终端启动。

5.4 现象:中文输出乱码

原因:Windows 控制台默认代码页是 GBK,而源文件通常是 UTF-8,两者不匹配。

解决:编译时加-fexec-charset=GBK,或者源文件保存为 GBK 编码;更推荐在程序开头调用SetConsoleOutputCP(65001)切换到 UTF-8。如果只是自己用,统一用 UTF-8 源文件加-finput-charset=UTF-8 -fexec-charset=GBK也能解决。

5.5 现象:mingw32-make 报 “missing separator”

原因:Makefile 里命令行前用了空格而不是 Tab。

解决:用编辑器显示不可见字符,把所有命令行前的缩进改成 Tab。VS Code 右下角可以切换缩进类型,选“Tab”。

6. 进阶技巧:用 -static 打包独立 exe,以及我的验证习惯

6.1 静态链接:让 exe 脱离 MinGW 环境运行

默认编译出的 exe 依赖libstdc++-6.dll、libgcc_s_seh-1.dll、libwinpthread-1.dll。换一台没装 MinGW 的电脑就跑不起来。解决办法是静态链接:

g++ -std=c++17 -O2 -static -static-libgcc -static-libstdc++ -o app_static.exe main.cpp utils.cpp logger.cpp

参数说明:

  • -static:尽量静态链接所有库。
  • -static-libgcc:静态链接 GCC 运行时。
  • -static-libstdc++:静态链接 C++ 标准库。

这样生成的 exe 体积会大一些(通常多几 MB),但拷到任何 64 位 Windows 上都能直接跑。如果还提示缺libwinpthread-1.dll,加上-Wl,-Bstatic -lwinpthread -Wl,-Bdynamic。

6.2 验证清单:我每次交付前都会走一遍

检查项命令预期结果
编译器版本g++ --version输出 GCC 版本和目标平台
警告全开编译g++ -Wall -Wextra -Werror ...无警告,有警告即失败
调试信息g++ -g ...+gdb断点能停住、能看变量
静态链接-static后拷到干净机器双击能运行
依赖检查ldd app.exe无 “not found”
清理重建mingw32-make clean && mingw32-make从零编译成功

6.3 一个具体技巧:用 -Werror 把警告当错误

很多 bug 在编译警告里已经提示了,比如未初始化变量、隐式类型转换、未使用变量。我习惯在开发阶段加-Werror,强制自己处理每一条警告:

g++ -std=c++17 -Wall -Wextra -Werror -Wpedantic -o app.exe main.cpp

-Wpedantic会检查严格 ISO C++ 合规性,帮你发现非标准扩展。发布时再去掉-Werror,避免因为第三方库的警告导致编译失败。

从那以后我每次配好一套新工具链,都会先写一个最小hello.cpp,用-Wall -Wextra -Werror编译一遍,再跑一次 gdb 断点,最后静态链接拷到虚拟机里双击。这套流程走完,才敢把环境交给别人用。希望帮到你。

本文还有配套的精品资源,点击获取

相关新闻

AI Agent底层基石:单次模型请求的三种方式与选型实战

AI Agent底层基石:单次模型请求的三种方式与选型实战

1. 为什么单次模型请求值得单独拎出来聊很多人一上来就搞多轮对话、工具调用、记忆管理&#xff0c;结果连一次干净的模型请求都发不明白。我见过太多项目&#xff0c;Agent 框架搭得花里胡哨&#xff0c;最后排查问题发现是底层单次请求的参数传错了&#xff0c;或者流式和非流…

2026/10/20 20:32:50 阅读更多 →
C#纯.NET工控仪表盘控件库:圆表直表旋钮开关指示灯全包

C#纯.NET工控仪表盘控件库:圆表直表旋钮开关指示灯全包

简介&#xff1a;这份C#仪表控件示例面向工控、组态及仿真界面开发者&#xff0c;尤其适合需要在WinForm应用中快速搭建可视化仪表界面的初中级程序员。资源以ActiveX控件技术为核心&#xff0c;演示了圆表、直表&#xff08;测量标尺&#xff09;、旋钮、开关和指示灯等常见仪…

2026/10/20 20:32:50 阅读更多 →
PyTorch转ONNX再到MNN:端侧图像模型部署全流程与踩坑实录

PyTorch转ONNX再到MNN:端侧图像模型部署全流程与踩坑实录

前阵子帮人将一个图像分类模型塞进移动端跑&#xff0c;模型在服务器上精度明明没问题&#xff0c;一换推理框架就开始出各种幺蛾子。Pytorch模型转成ONNX和MNN这件事&#xff0c;听起来就是两行命令的事&#xff0c;实际推进时要把图的导出机制、算子兼容、精度对齐全走一遍&a…

2026/10/20 20:32:50 阅读更多 →

最新新闻

代码托管平台访问慢?从DNS到资源加载的全链路优化指南

代码托管平台访问慢?从DNS到资源加载的全链路优化指南

1. 为什么打开代码托管平台会慢&#xff1a;先搞懂瓶颈在哪很多人一遇到页面转圈&#xff0c;第一反应就是“网不行”&#xff0c;然后开始重启路由器、切换网络&#xff0c;折腾半天发现该慢还是慢。我刚开始也这样&#xff0c;后来才意识到&#xff0c;打开这类海外代码托管平…

2026/10/21 5:28:10 阅读更多 →
PHP性能调优实战:Xdebug与QCacheGrind定位慢接口分析

PHP性能调优实战:Xdebug与QCacheGrind定位慢接口分析

做PHP开发这几年&#xff0c;我最大的体会是&#xff1a;性能问题不是靠猜&#xff0c;而是要靠数据说话。一个接口从20ms变成200ms&#xff0c;一行SQL的事&#xff1b;一个页面响应慢到让人抓狂&#xff0c;可能只是循环里不小心嵌套了一次查询。但难的不是修&#xff0c;而是…

2026/10/21 5:28:10 阅读更多 →
Agent零基础实操指南:用低代码搭一个能干的数字分身

Agent零基础实操指南:用低代码搭一个能干的数字分身

1. 为什么现在都在聊Agent&#xff1f;先搞清楚它到底解决了什么问题我接触过不少刚工作一两年的职场新人&#xff0c;也包括还在上学但已经开始实习的同学&#xff0c;大家挂在嘴边的一句话是&#xff1a;“事情太多太杂&#xff0c;精力不够用。”写周报、整理会议纪要、找文…

2026/10/21 5:28:10 阅读更多 →
ARM Linux嵌入式libiconv构建与字符集转换实战指南

ARM Linux嵌入式libiconv构建与字符集转换实战指南

简介&#xff1a;本资源是专为ARM架构Linux嵌入式系统定制的libiconv字符编码转换库&#xff0c;面向嵌入式开发工程师、交叉编译实践者及需在树莓派、ARM网关等设备上处理多语言文本&#xff08;如UTF-8/GB2312/ASCII互转&#xff09;的技术人员。资源通过arm-none-linux-gnue…

2026/10/21 5:28:10 阅读更多 →
降AI率有套路!3步把论文AIGC检测率从80%降到5%

降AI率有套路!3步把论文AIGC检测率从80%降到5%

又到交论文的季节了&#xff0c;后台收到好多私信&#xff0c;问的最多的就是“AI率太高怎么办”。说实话&#xff0c;我看到不少同学用AI辅助写完后&#xff0c;一检测&#xff0c;AI率直奔80%。这个数字确实吓人&#xff0c;但别慌&#xff0c;这题我能解。这篇就把我自己实操…

2026/10/21 5:28:10 阅读更多 →
在线字典学习MATLAB实现:稀疏编码与字典更新实战指南

在线字典学习MATLAB实现:稀疏编码与字典更新实战指南

简介&#xff1a;在线字典学习代码是一套基于MATLAB的机器学习实现资源&#xff0c;面向处理文本、音频等序列数据的开发者与研究者。代码演示了在线学习与字典学习的结合&#xff1a;通过逐样本或小批量方式更新模型参数&#xff0c;在节省内存的同时适应数据流场景&#xff0…

2026/10/21 5:27:10 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事&#xff1a;AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里&#xff0c;按宣传口径&#xff0c;本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”&#xff0c;而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起&#xff1a;用户到底在追求什么“封号重开”这四个字&#xff0c;放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流&#xff0c;背后是大量的时间和精力成本。正常情况下&#xff0c;没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”&#xff0c;而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时&#xff0c;就意识到&#xff1a;单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/21 4:27:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →