MinGW GCC 4.6.2 Windows编译环境搭建与实战避坑指南

简介:MinGW(Minimalist GNU for Windows)是一套面向Windows平台的开源C/C++开发工具链,压缩包内含基于GCC 4.6.2的完整编译环境,适合需要在Windows下编译运行C/C++程序、又希望摆脱Visual C++等商业环境的开发者、算法选手或嵌入式学习者。7z压缩包共1685个文件,大小46.24MB,包含695个C头文件、265个C++头文件、194个静态库文件(a),以及编译驱动、链接器、make等可执行程序和少量DLL、文档。头文件与库文件覆盖C99、C++03标准特性,并支持直接调用Windows API,可生成不依赖额外运行时库的原生程序。GCC还支持C++、Fortran、Objective-C等语言,附带的gfortran、gcov等工具便于代码覆盖率测试与多语言开发。配合MSYS可获得类Unix命令行环境,方便脚本化构建与依赖管理。该资源已获得727人学习下载,社区文献与示例文件完整,适合初次搭建自主编译环境的开发者,也可作为研究GCC内部结构与MinGW工程布局的参考。

1. 还在翻 MinGW 4.6.2 的人,多半不是图新鲜

老版本的编译器工具链,往往比新版本更让人头疼,但去掉壳子之后,你其实是在找一套能落的地的、不折腾的编译环境。MinGW(gcc 4.6.2)就是这么个东西:2011 年左右的版本,Windows 原生的 GCC 工具链,不依赖 Cygwin 那套 POSIX 模拟层,编译出来的 exe 直接跑,不带乱七八糟的 DLL。到今天还有人翻出来,要么是维护老工程,要么是某个教材、某套源码恰好锁定了这个版本的编译行为,要么是嵌入式交叉编译场景里,对老编译器有路径依赖。

这套资源能解决的就是一件事:让你在一台新电脑上,快速把这版编译链跑起来,别在安装、环境变量、路径和 Makefile 兼容性上耗掉一晚上的时间。它适合这几类人:手上有旧项目必须用它编译的,在还原实验环境的,以及想对比 GCC 不同版本代码生成差异的。下面的内容照着走即可,我不会给你推荐“升级到最新版”这种废话,因为你已经把版本锁死了。

2. 选型和目录规划:为什么 4.6.2 值得单独装一个环境

2.1 先搞明白这个版本的边界在哪里

GCC 4.6.2 是 GCC 4.6 系列的一个补丁版本,比 4.6.0 修了一批后端 bug,但 C++ 标准支持停留在“C++11 草案”的早期阶段。它支持-std=c++0x,部分拉通了对auto、范围 for 循环、nullptr、constexpr(有限支持)的解析,但std::thread、std::function这类库层面的东西在这一版里缺胳膊少腿,编译期有时会因为头文件缺失或实现不完整直接报错。

如果你是在 Windows 下用,还必须接受它的运行时依赖方式是libgcc_s_dw2-1.dll、libstdc++-6.dll。这意味着你编译出的 exe 如果没做静态链接,丢到别的机器上需要带这些 DLL。这个特性对老工程可能无所谓,但如果你要分发程序,就得知道-static-libgcc -static-libstdc++这两个参数可以帮你把它们揉进 exe 里,后面第 3 章会专门讲到。

建议装这个版本时单独建目录,比如D:\mingw462,别装到默认路径C:\MinGW或者带空格的路径里。老版本工具链对带空格的路径支持不差,但 Makefile 里如果没加引号,路径解析就翻车。单独建目录也方便你以后切版本向后比较,不至于和别的编译器混在一起。

2.2 读写资源的结构:一个纯粹的编译器根目录

这套资源下载下来后,目录结构跟官方 MinGW 发行版一致:

路径内容作用
\bingcc.exe、g++.exe、mingw32-make.exe、ar.exe、dlltool.exe、windres.exe核心工具链
\includeC/C++ 标准头文件及平台头文件编译时搜头文件
\liblibgcc.a、libstdc++.a、libmingw32.a等静态库链接阶段库搜索路径
\lib\gcc\mingw32\4.6.2编译器内部组件和 crt 启动文件一般不用手动动
\share文档与国际化文件可忽略

解压后不要直接双击 exe 就开始用,先确认结构完整。安装完环境变量指向这里的\bin,顺序放在系统 PATH 靠前位置即可。如果电脑上还装了其他编译器或发行版,注意 PATH 顺序会直接决定你用哪个 gcc,这个问题我会专门放进避坑章。

2.3 Windows 7 到 Win11 的兼容预期

很多人担心这种老版本工具链在新 Windows 上跑不动。事实上 MinGW 编译出的东西用的是 Windows 原生 API,不需要额外的运行时补丁。我实际见过的场景里,Win10 21H2 和 Win11 跑 4.6.2 都正常,唯一的例外是 Windows Server 的某些精简版缺了 VC 运行库,但这跟 MinGW 本身无关,装上 VC 运行库就能解决。

但有一个细节:4.6.2 的mingw32-make.exe在并行编译时偶尔会卡进程。这个问题不是你操作的问题,而是老版本 make 在 Windows 上处理子进程退出的机制不干净。尽量避免-j8这种激进并行,-j2已经能拿到大部分收益,这一点在后面的实战和避坑章节里都会反复出现。

3. 安装部署与编译实战:把这套链子真正跑起来

3.1 解压部署与环境变量配置步骤

假设你下载到的资源是mingw462.7z或mingw462.zip,第一步把它解压到D:\mingw462,然后在系统环境变量里追加配置。

具体步骤:

  1. 按Win + R输入sysdm.cpl,打开“系统属性”。
  2. 切到“高级”选项卡,点击“环境变量”。
  3. 在“系统变量”里选中Path,点击“编辑”。
  4. 在变量值最前面加D:\mingw462\bin;,注意分号不要漏。
# 验证安装是否生效,打开一个新的 cmd 窗口,输入: gcc --version # 预期输出类似: # gcc.exe (GCC) 4.6.2 # Copyright (C) 2011 Free Software Foundation, Inc.

Path放在最前面的原因是防止系统里可能安装过的其他编译器抢占优先级。我见过装了 VS Build Tools 之后,gcc命令指向了 VS 自带的gcc.exe,虽然这种情况很少,但 PATH 顺序的坑一旦踩到,报错信息会误导你查半天。

如果你用的是 PowerShell 或者 Git Bash,记得把环境变量改完之后重开终端窗口,否则新开的会话不会加载新的 PATH 值。这是个高频翻车点,后面避坑章单独说。

3.2 用 gcc 命令编译第一个 C 程序,附带链接参数

新建一个测试文件hello.c:

#include <stdio.h> int main(void) { printf("MinGW 4.6.2 running on Windows\n"); return 0; }

编译并运行:

cd D:\mingw462_test gcc hello.c -o hello.exe hello.exe

从编译的角度看,命令结构就是gcc <源文件> -o <输出名>。如果不写-o,默认输出a.exe,这在 Windows 上没有毛病,但工程规范上建议显式命名。

通常你会发现,在不同发行版的 PowerShell 里直接运行hello.exe可能被安全策略挡住,这是执行策略问题,用.\hello.exe即可。

如果需要静态链接运行时:

gcc hello.c -o hello_static.exe -static-libgcc -static-libstdc++

-static-libgcc和-static-libstdc++这两个参数对这个版本非常重要:4.6.2 编译出来的程序默认依赖libwinpthread-1.dll、libgcc_s_dw2-1.dll。如果你要拷给别的机器用,不带上这些参数,目标机必须装 MinGW 运行库,否则双击就是“找不到 DLL”。做了一线开发这么久,我一般写发布脚本时都会把这两个参数固定加进去,可以省掉很多环境排查的麻烦。

3.3 写一个 Makefile 把编译流程固化下来

手敲命令只能应付单文件,正规一点的模拟项目通常直接上 Makefile。

目标验证 C++ 的std::string、vector、简单的继承是否可用,这个版本在基本语法上不会有问题。

建一个Makefile:

CC = gcc CXX = g++ CFLAGS = -Wall -O2 CXXFLAGS = -Wall -O2 -std=c++0x TARGET = app.exe OBJS = main.o utils.o $(TARGET): $(OBJS) $(CC) $(OBJS) -o $(TARGET) main.o: main.c utils.h $(CC) $(CFLAGS) -c main.c utils.o: utils.c utils.h $(CC) $(CFLAGS) -c utils.c clean: del *.o $(TARGET)

注意del是 Windows 的删除命令,而在 Linux 风格的 Makefile 里通常写rm -f。这个区别是 Windows 版 Makefile 最常见的坑。MinGW 自带的mingw32-make会调用cmd.exe来执行这里的 shell 命令,所以你写del它能识别;如果你拿的是 GNU make 或者从别的项目里拷贝了一个用rm的 Makefile,直接报错。

运行命令是mingw32-make(不带参数执行全部目标)。如果你习惯了 Linux 的make,可以把mingw32-make复制一份改名成make.exe,或者建一个别名,这个看个人习惯,我一般会在 bin 目录下复制成make.exe。

3.4 静态库的编译与使用,让工程结构更像实际项目

实际工程里很少所有代码都在一个可执行文件里,静态库让模块间解耦。

先生成静态库:

gcc -c utils.c -o utils.o ar rcs libutils.a utils.o

然后链接:

gcc main.c -L. -lutils -o app.exe

ar rcs是 MinGW 自带的归档工具,rcs分别表示:r替换文件、c创建归档文件时不提醒、s写入索引。链接时-L.告诉链接器去当前目录找库文件,-lutils对应的是libutils.a,注意省略了前缀lib和后缀.a。

在 4.6.2 这个版本上,如果你用 C++ 写静态库,链接时偶发“未定义的引用”问题,通常是因为用户忘了在.h里加extern "C"。这个版本对 C++ 链接的检查比新版严格,事后来看,花两分钟检查头文件的导出声明,比在链接器参数上调试一小时都有效。

4. 避坑排查:这一版工具链最容易翻车的五个位置

4.1 编译时提示 “unknown type name ‘bool’”

现象:编译 C 文件但使用了bool,报错unknown type name 'bool'。

原因:C99 标准里bool需要<stdbool.h>,4.6.2 在默认的 Gnu89 模式下不识别该关键字。很多老教材的代码直接写bool flag;且不带头文件,导致在新环境直接翻车。

解决:在 C 文件中加#include <stdbool.h>,或者编译时加-std=gnu99。

4.2 exe 复制到别的机器上提示缺少 DLL

现象:在开发机上编译运行正常,拷到别的 Windows 机器双击,报libgcc_s_dw2-1.dll 找不到。

原因:4.6.2 的默认链接方式是动态链接 GCC 运行时,目标机器上没装 MinGW 运行时环境。

解决:把-static-libgcc -static-libstdc++固定加入链接参数。另外要注意,如果你用了-mthreads或引用winpthread,可能需要再加-static把整个 lib 链静态化。

4.3 安装了新版 MinGW 后 gcc 版本对不上

现象:终端里执行gcc --version显示的版本不是你预期的那一个。

原因:系统 PATH 里同时存在多个 MinGW 的 bin 目录,旧版本被新版本覆盖,或者相反。

解决:强制把本资源的路径放在Path变量最前面。更严格的做法是把Path里的其他编译器路径临时屏蔽或重命名。平时我就在命令行第一件事执行where gcc,确认当前解析的是哪个路径,再决定要不要跑脚本。

4.4 使用 -j8 并行编译时 make 进程挂起

现象:mingw32-make -j8编到中途卡住不动,CPU 占用降到 0,子进程僵死。

原因:4.6.2 时代自带的 make 在 Windows 上的进程管理等价物是_spawn,并发多的时候管道回收协议容易卡死。新版本 make 重写了这部分才解决。

解决:并行数控制在-j2或-j4,绝大部分工程编译时间能压缩 50% 以上就够了。如果你一定要-j8,先用-j4编译一次全量 clean,再-j8增量编译。

4.5 带空格路径下编译失败,偏偏报的是头文件找不到

现象:工程放在C:\Users\Admin\My Documents\demo,编译报fatal error: stdio.h: No such file or directory,但stdio.h确实在 include 目录里。

原因:编译器路径解析到带空格目录时,某些老版本内建的 include 路径拼接方式出错,尤其是在相对路径模式下。

解决:把工程目录和 MinGW 安装目录都改成无空格路径,这是最稳的解法。如果不想改目录,快捷键方式是用cmd /c里cd到工程目录,并确保环境变量CPATH没有设置额外路径。

5. 进阶验证:用一晚上的时间把这版编译器摸透

很多人在拿到老版本工具链后只想让它赶紧编过,没打算深入它的行为边界。但如果你的场景是教学复现或者对照实验,建议花一晚上做一套验证流程,把它的行为摸清,后面出任何问题都别慌。

第一步是做编译器自检,把 GCC 4.6.2 实际支持的 C/C++ 标准关键特性列出来。建一个feature_test.cpp:

#include <cstdio> #include <vector> #include <string> // 测试 C++11 早期支持 auto add = [](int a, int b) -> int { return a + b; }; int main() { std::vector<int> v = {1, 2, 3}; printf("lambda result: %d\n", add(2, 3)); printf("vector size: %zu\n", v.size()); return 0; }

编译:

g++ -std=c++0x feature_test.cpp -o feature_test.exe

4.6.2 对 lambda 和初始化列表的支持,基本上到这个版本已经可用了,但std::function和std::shared_ptr这类库设施在 4.6 里还不够成熟,用的时候容易出幺蛾子。验证时真正有用的结论有三条:第一,4.6.2 的 GCC 对 C++11 的支持是「语法层面部分支持,库层面滞后」;第二,编译器的-O2优化生成的代码在 4.6.2 上偶尔和 4.8+ 有行为差异,典型的是浮点运算顺序和未定义行为长出来的 bug;第三,-Wall在这个版本上警告阈值比新版低,意味着很多新版会报警的代码它静默通过,你的代码真实质量要靠自己把关。

第二步是验证二进制兼容性。用这个版本编译出的.o文件和更高版本的.o文件不要混在一起链接,4.6.2 的目标文件格式虽然也是 ELF,但 C++ ABI 有微妙差异。我有一次混用了 4.6.2 编的.o和另一个版本编的.a,链接器直接报了一大串undefined reference,排查了整整两天,最后才发现是 ABI 不匹配。

第三步是把源码打成一个小型发布包,测试静态链接后的 exe 在干净系统上的运行表现。具体做法是编译时加-static-libgcc -static-libstdc++,然后拷贝到一台没装任何开发工具的机器上跑一遍。这个步骤约等于给自己留一张“后悔药”:以后有任何新版编译器编不过的场景,这个 exe 是你最后的参照物。

从那以后我再做任何老版本工具链的交付,都会强制自己走一遍这套验证流程,把标准支持边界、ABI 混用风险、静态链接行为全确认一遍,省得用户某个夜里突然发消息说程序跑不起来,还得帮他猜是不是编译器兼容问题。希望帮到你。

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

相关新闻

多版本自适应逆向适配:x64客户端特征码扫描与配置映射实践

多版本自适应逆向适配:x64客户端特征码扫描与配置映射实践

1. 项目背景与整体思路拆解1.1 版本碎片化&#xff0c;是逆向方案能否长期存活的关键做逆向的活儿&#xff0c;最怕的其实不是看不懂汇编&#xff0c;而是你刚把汇编定位清楚&#xff0c;客户端更新了。这次要复盘的项目&#xff0c;目标很明确&#xff1a;针对某个PC端即时通讯…

2026/10/20 16:24:00 阅读更多 →
大模型竞赛加速下,国产AI新一轮更新的关键与开发者避坑指南

大模型竞赛加速下,国产AI新一轮更新的关键与开发者避坑指南

1. 大模型竞赛的节奏为什么突然变了过去一年多&#xff0c;我一直在跟踪各类大模型的迭代节奏&#xff0c;从最早的季度更新&#xff0c;到后来一个月一版&#xff0c;再到现在几乎每周都有新动作。这个加速不是错觉&#xff0c;而是整个行业进入了一个新的竞争阶段。以前大家比…

2026/10/20 16:22:55 阅读更多 →
OpenCvSharp实战:C#图像处理从Mat到Bitmap的转换与边缘检测

OpenCvSharp实战:C#图像处理从Mat到Bitmap的转换与边缘检测

简介&#xff1a;这是基于OpenCvSharp开发的C#图片显示控件Demo&#xff0c;面向需要在WinForms或WPF中集成OpenCV图像处理的开发者。控件支持图片显示、任意缩放、鼠标位置与各颜色通道信息实时获取&#xff0c;并内置圆、点、线、矩形绘制能力&#xff0c;UI可交互调整形状大…

2026/10/20 16:22:55 阅读更多 →

最新新闻

AI编程从操作到范式:任务分解、上下文组织与验证的底层方法

AI编程从操作到范式:任务分解、上下文组织与验证的底层方法

1. 为什么“记操作”这条路从一开始就走不通 我见过太多人学 AI 编程的方式&#xff0c;是打开一个收藏夹&#xff0c;里面躺着几十个“XX 工具从入门到精通”的教程&#xff0c;然后一条条照着敲。提示词模板存了一整个备忘录&#xff0c;快捷键背得比自己的手机号还熟。结果呢…

2026/10/20 17:17:46 阅读更多 →
CAN FD 可变速率切换(BRS)与采样点漂移:示波器位时间容差排查实战

CAN FD 可变速率切换(BRS)与采样点漂移:示波器位时间容差排查实战

在智能新能源汽车域控制器、工业重载机器人以及储能变流器控制系统中&#xff0c;传统 CAN 2.0 总线的 1Mbps 带宽与单帧 8 字节有效载荷早已不堪重负。CAN FD&#xff08;Flexible Data-rate&#xff09;协议凭借高达 64 字节的数据载荷容量以及在数据段将速率提升至 2Mbps~5M…

2026/10/20 17:17:46 阅读更多 →
本地知识库配Deepseek:Cherry Studio与AnythingLLM部署避坑指南

本地知识库配Deepseek:Cherry Studio与AnythingLLM部署避坑指南

简介&#xff1a;这份资源围绕 Deepseek 与本地知识库的部署方法及应用场景展开&#xff0c;面向有一定技术基础的企业用户、个人开发者以及对隐私保护敏感、希望私有化部署的人群。内容涵盖基于 Cherry Studio 与 AnythingLLM 两套工具的完整搭建思路&#xff0c;包括嵌入模型…

2026/10/20 17:17:46 阅读更多 →
PartLLM:用文本统一3D部件分割,一个模型搞定三类任务

PartLLM:用文本统一3D部件分割,一个模型搞定三类任务

1. 从"切蛋糕"说起&#xff1a;3D部件分割到底难在哪如果你接触过三维建模、数字孪生或者机器人抓取相关的项目&#xff0c;大概率会被同一个问题折磨过&#xff1a;拿到一个完整的三维网格模型&#xff0c;怎么把它拆成有语义的部件&#xff1f;比如一把椅子&#x…

2026/10/20 17:17:46 阅读更多 →
Flink实时热榜TopN实战:窗口设计与两阶段聚合

Flink实时热榜TopN实战:窗口设计与两阶段聚合

做实时热榜这个话题&#xff0c;说多了都是泪。你在后台看需求&#xff0c;通常就一句话&#xff1a;“把最近5分钟最热的内容排出来”&#xff0c;可真做起来会发现&#xff0c;这句话背后牵扯出的是流式计算里几乎所有经典难题&#xff1a;事件时间怎么对齐、窗口边界如何处理…

2026/10/20 17:17:46 阅读更多 →
Cornell抓取数据集txt转pcd全流程:从2D标注到3D可执行姿态

Cornell抓取数据集txt转pcd全流程:从2D标注到3D可执行姿态

1. 项目概述&#xff1a;为什么康奈尔抓取检测数据集至今仍是点云理解的“教科书级”起点 如果你正在做机器人抓取规划、6D位姿估计&#xff0c;或者刚入门三维视觉方向&#xff0c;大概率绕不开Cornell Grasp Detection Dataset——这个2013年发布的经典数据集&#xff0c;至今…

2026/10/20 17:16:45 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* 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 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* 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 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* 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 1:01:30 阅读更多 →

周新闻

基于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/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

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

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

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

月新闻

我发现了一个新思路:用 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 阅读更多 →