mingw32 2.95 在现代 Windows 上的编译与避坑指南
简介MingW32 2.95 是一套面向 Windows 平台的轻量级开源 GNU 开发工具集基于 GCC 2.95 系列编译器为需要在 Windows 上构建本地化 C/C 程序的开发者提供头文件、库与命令行编译环境。它体积小巧、依赖少、API 稳定适合维护老项目、资源受限环境或对现代特性需求不高的场景也可作为了解早期 MinGW 工具链与 GCC 演进的教学素材。压缩包为 rar 格式共 517 个文件约 4.52MB其中 301 个 h 头文件用于声明 Windows API 与标准库接口82 个 a 静态库和 51 个 def 模块定义文件支撑链接过程另有 17 个 exe 可执行文件及少量 o、c、cc 源码与 STL 头文件目录结构清晰。目前已有 306 人学习下载。通过该资源可快速搭建旧版编译环境理解 bin、include、lib 等目录分工掌握 gcc/g 编译链接流程并借助 libkernel32.a、libstdc.a 等库文件完成与 Windows API 交互的程序构建是研究经典工具链的实用参考。1. mingw32 2.95一个被时间封存的 Windows 编译工具链如果你在 2024 年还听到有人提起 mingw32 2.95大概率不是他刚从 1999 年穿越回来而是他正在维护一套十几年前甚至二十年前的 C/C 遗留工程。mingw32 2.95 是 GCC 2.95 系列在 Windows 平台上的移植版本它把 GNU 编译器套件带到了 Win32 环境让开发者可以在 Windows 上编译出原生 PE 格式的可执行文件而不需要依赖 Cygwin 那层 POSIX 模拟。这个版本最特殊的地方在于它对应的是 GCC 2.95.x 这个分支C 标准还停留在 C98 之前的草稿阶段STL 实现和异常处理机制跟现代 GCC 差异巨大。今天还在碰它的人通常面对的是工业控制、军工遗留系统、老版本嵌入式 SDK 或者某些只提供 mingw32 2.95 预编译库的第三方组件。这篇文章不讲怀旧只讲怎么让这套老工具链在现代 Windows 上跑起来、编得过、链接不报错以及哪些坑一旦踩了连后悔药都没得吃。2. 把 mingw32 2.95 装进现代 Windows路径、环境变量与兼容层2.1 为什么不能直接双击安装包mingw32 2.95 时代的安装包大多是自解压的 ZIP 或者 InstallShield 格式直接在现代 Windows 10/11 上运行会遇到两个硬性问题。第一安装程序里的路径硬编码了C:\Program Files这种带空格的目录而 GCC 2.95 的驱动脚本对空格路径处理极差经常在调用cpp或cc1plus时把路径截断。第二老版本安装包里的gcc.exe和ld.exe是 16 位或混合 32 位 PE 格式Windows 的安装程序兼容性检测会直接拦截。我一般会放弃安装包直接找原始的压缩包版本手动解压到一个无空格、无中文、路径尽量短的目录比如C:\mingw32-295。解压后目录结构通常是bin、lib、include、i386-mingw32这几层bin下面放着gcc.exe、g.exe、ld.exe、windres.exe等核心工具。2.2 环境变量配置的四个关键点手动解压之后环境变量是让工具链活过来的第一步。很多人只加PATH结果编译时找不到头文件或者链接时找不到libgcc.a。下面是我在 Windows 上配置 mingw32 2.95 时固定会设的几组变量# 假设解压目录为 C:\mingw32-295 set MINGW32_ROOTC:\mingw32-295 set PATH%MINGW32_ROOT%\bin;%PATH% set C_INCLUDE_PATH%MINGW32_ROOT%\include;%MINGW32_ROOT%\i386-mingw32\include set CPLUS_INCLUDE_PATH%MINGW32_ROOT%\include\g-3;%MINGW32_ROOT%\include;%MINGW32_ROOT%\i386-mingw32\include set LIBRARY_PATH%MINGW32_ROOT%\lib;%MINGW32_ROOT%\i386-mingw32\lib这几行里MINGW32_ROOT是根目录锚点后面所有路径都基于它。PATH让系统能找到gcc.exe。C_INCLUDE_PATH和CPLUS_INCLUDE_PATH分别告诉 C 和 C 编译器去哪里找标准头文件注意 GCC 2.95 的 C 头文件放在include\g-3这个子目录下而不是现代 GCC 的include\c\版本号。LIBRARY_PATH是链接器搜索库文件的路径libgcc.a、libstdc.a、libmingw32.a都在lib或i386-mingw32\lib下面。配完之后开一个新的 cmd 窗口执行gcc -v如果能看到Reading specs from ...并且版本号显示2.95.x说明工具链已经能被调用了。2.3 用批处理脚本固化编译环境每次开命令行手动 set 一遍不现实我习惯在项目根目录放一个env.bat内容就是上面那几行 set然后所有编译操作都在这个脚本调用的 cmd 里进行。更进一步如果项目用 Makefile 或者手写编译脚本可以在脚本开头直接调用env.bat保证构建环境一致。下面是一个最小化的编译测试用来验证工具链是否完整# test.c #include stdio.h int main(void) { printf(mingw32 2.95 works\n); return 0; }编译命令gcc -o test.exe test.c如果这一步报stdio.h: No such file or directory说明C_INCLUDE_PATH没设对如果报cannot find -lmingw32说明LIBRARY_PATH缺了i386-mingw32\lib。这两个错误在初次配置时出现频率最高排查时优先看环境变量里的路径是否真的存在对应文件。3. 用 mingw32 2.95 编译 C 代码从 Hello World 到 STL 容器3.1 C 编译命令与标准库链接mingw32 2.95 里的 C 编译器是g.exe它和gcc.exe的区别在于会自动链接libstdc.a并启用 C 前端。编译一个最简单的 C 程序// hello.cpp #include iostream int main() { std::cout hello from mingw32 2.95 std::endl; return 0; }编译命令g -o hello.exe hello.cpp这里不需要手动加-lstdc因为g驱动会自动处理。但如果你用gcc去编译.cpp文件就必须显式加-lstdc否则链接阶段会报undefined reference to std::cout之类的错误。GCC 2.95 的 C 标准库实现是 SGI STL 的一个分支头文件没有后缀比如#include vector而不是vector.h但命名空间std已经存在。需要注意的是这个版本的 STL 对模板偏特化和成员模板的支持不完整现代 C 代码里常见的std::vectorstd::pairint, std::string这种嵌套写法在 2.95 上可能直接编译失败报错信息通常是parse error before 或者template argument 2 is invalid。3.2 处理 STL 容器的三个实操细节第一个细节是std::string的 COW 实现。GCC 2.95 的std::string采用写时复制Copy-On-Write这在多线程环境下是灾难但单线程代码里性能很好。如果你从现代编译器迁移代码过来不要假设str[0]能拿到可写缓冲区2.95 的operator[]返回的是char而不是char想修改内容必须用str.at(i)或者先const_cast。第二个细节是std::vector的push_back在扩容时用的是memcpy而不是拷贝构造函数对于含有自引用指针的对象扩容后指针会悬空。第三个细节是异常处理GCC 2.95 默认可能没开-fexceptions如果代码里用了try/catch编译时加上-fexceptions否则异常抛出后直接abort。下面是一个在 mingw32 2.95 上能跑通的 STL 示例用了vector和map#include iostream #include vector #include map #include string int main() { std::vectorint v; for (int i 0; i 5; i) { v.push_back(i * 10); } std::mapstd::string, int m; m[one] 1; m[two] 2; for (std::vectorint::iterator it v.begin(); it ! v.end(); it) { std::cout *it ; } std::cout std::endl; std::cout m[one] m[two] std::endl; return 0; }编译命令加-fexceptionsg -fexceptions -o stl_test.exe stl_test.cpp如果编译时报cannot find -lstdc检查LIBRARY_PATH里是否包含libstdc.a所在目录。如果运行时报libstdc-3.dll not found说明你编译的是动态链接版本需要把bin目录下的libstdc-3.dll复制到 exe 同目录或者编译时加-static静态链接。3.3 静态链接与动态链接的选择mingw32 2.95 默认行为取决于你拿到的发行包配置。有的包默认动态链接libgcc和libstdc生成的 exe 依赖libgcc-3.dll和libstdc-3.dll。在工业现场部署时我强烈建议静态链接避免目标机器缺 DLL 导致程序起不来。静态链接的命令是在编译和链接时都加-staticg -static -o stl_static.exe stl_test.cpp加-static后libgcc.a和libstdc.a会被完整链入 exe文件体积会大几百 KB但换来的是单文件部署。注意如果项目里还链接了其他第三方动态库-static只影响 GCC 自己的运行时库不影响那些第三方库。4. 避坑mingw32 2.95 在现代 Windows 上的五个翻车现场4.1 编译时报 “CreateProcess: No such file or directory”现象执行gcc -o test.exe test.c时报错gcc: CreateProcess: No such file or directory但gcc -v能正常输出版本信息。原因GCC 2.95 的驱动在调用cc1.exe或cc1plus.exe时依赖PATH环境变量能找到这些内部程序。如果PATH里只有gcc.exe所在目录但cc1.exe实际在lib\gcc-lib\i386-mingw32\2.95下面就会找不到。解决把lib\gcc-lib\i386-mingw32\2.95也加到PATH里或者用-B参数指定 GCC 的内部程序搜索路径例如gcc -B C:\mingw32-295\lib\gcc-lib\i386-mingw32\2.95 -o test.exe test.c。4.2 链接时报 “undefined reference to __mingw32_init_mainargs”现象编译一个带main函数的 C 程序链接阶段报undefined reference to __mingw32_init_mainargs。原因这个符号在libmingw32.a里而libmingw32.a没有被自动链接。GCC 2.95 的 specs 文件里可能没有正确配置默认库列表。解决手动加-lmingw32并且确保LIBRARY_PATH包含i386-mingw32\lib。如果还不行检查libmingw32.a是否真的存在于该目录有些精简版发行包会漏掉这个库。4.3 运行时报 “Unable to run program: 不是有效的 Win32 应用程序”现象编译生成的 exe 在 64 位 Windows 上双击运行弹出“不是有效的 Win32 应用程序”。原因mingw32 2.95 生成的是 32 位 PE 文件64 位 Windows 本身能运行 32 位程序但如果 exe 被错误地标记为 16 位或者 PE 头损坏就会报这个错。更常见的原因是编译时用了-mno-cygwin之外的错误选项导致输出格式不对。解决用file命令Cygwin 或 Git Bash 里检查 exe 格式正常应该显示PE32 executable (console) Intel 80386。如果显示MS-DOS executable说明链接器用错了。检查gcc -v输出里的Target: i386-mingw32如果不是这个 target说明工具链装错了版本。4.4 头文件里出现 “#include windows.h 报错”现象编译 Windows GUI 程序时#include windows.h报大量语法错误比如parse error before DECLSPEC_IMPORT。原因mingw32 2.95 自带的windows.h是 1999 年左右的版本缺少很多现代 Windows SDK 里的宏定义和类型。如果你从现代 SDK 里拷贝了头文件过来版本不匹配会导致解析失败。解决坚持使用 mingw32 2.95 自带的windows.h不要混用现代 SDK 头文件。如果必须用新 API手动在代码里声明函数原型和常量或者用LoadLibraryGetProcAddress动态加载。4.5 编译速度极慢且 CPU 占用高现象编译一个几千行的 C 文件耗时超过一分钟CPU 单核跑满。原因GCC 2.95 没有现代编译器的增量编译和并行优化而且它的优化器-O2在某些代码上会退化。另外如果TMP或TEMP指向的目录有大量文件临时文件创建也会变慢。解决编译时用-O0关闭优化速度会快很多。如果必须开优化用-O1而不是-O2。把TMP和TEMP指向一个空目录比如set TMPC:\temp并确保该目录存在且为空。5. 让 mingw32 2.95 与现代化构建流程共存5.1 用 CMake 生成 mingw32 2.95 能用的 MakefileCMake 本身不依赖编译器版本但生成的 Makefile 里会调用gcc和g。要让 CMake 使用 mingw32 2.95需要在配置时指定编译器路径和工具链文件。下面是一个最小化的toolchain-mingw32-295.cmakeset(CMAKE_SYSTEM_NAME Windows) set(CMAKE_C_COMPILER C:/mingw32-295/bin/gcc.exe) set(CMAKE_CXX_COMPILER C:/mingw32-295/bin/g.exe) set(CMAKE_FIND_ROOT_PATH C:/mingw32-295) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)配置命令cmake -G Unix Makefiles -DCMAKE_TOOLCHAIN_FILEtoolchain-mingw32-295.cmake ..注意CMake 的现代版本可能会在生成的 Makefile 里加入-stdgnu11之类的选项GCC 2.95 不认识这些选项会直接报错。解决办法是在CMakeLists.txt里显式设置CMAKE_CXX_FLAGS为空或者用-DCMAKE_CXX_FLAGS覆盖。5.2 用批处理做增量编译的简易方案GCC 2.95 没有-MMD生成依赖文件的功能或者支持不完整所以 Makefile 里自动依赖比较麻烦。我一般用批处理脚本做全量编译但通过比较源文件和目标文件的时间戳来跳过未修改的文件。下面是一个简化版的build.batecho off setlocal set MINGW32_ROOTC:\mingw32-295 set PATH%MINGW32_ROOT%\bin;%PATH% set CPLUS_INCLUDE_PATH%MINGW32_ROOT%\include\g-3;%MINGW32_ROOT%\include set LIBRARY_PATH%MINGW32_ROOT%\lib;%MINGW32_ROOT%\i386-mingw32\lib if not exist obj mkdir obj for %%f in (src\*.cpp) do ( set SRC%%f set OBJobj\%%~nf.o if not exist !OBJ! goto compile for /f %%t in (dir /b /o:d !SRC! !OBJ!) do set NEWEST%%t if !NEWEST!!SRC! goto compile goto skip :compile echo Compiling %%f ... g -c -fexceptions -o !OBJ! %%f :skip ) g -o app.exe obj\*.o -static endlocal这个脚本的逻辑是遍历src下的所有.cpp如果对应的.o不存在或者源文件比.o新就重新编译。最后把所有.o链接成app.exe。注意!OBJ!这种延迟变量展开在批处理里需要setlocal enabledelayedexpansion上面省略了这行实际使用时要在setlocal后面加上。5.3 用现代编辑器写代码、用老编译器编译完全可以在 VS Code 里写代码然后用外部工具调用 mingw32 2.95 编译。VS Code 的tasks.json里配置一个 task命令指向C:\mingw32-295\bin\g.exe参数按项目需要填。这样既能享受现代编辑器的补全和跳转又能保证编译结果和老环境一致。唯一需要注意的是VS Code 的 C/C 插件默认用现代 GCC 的头文件做语法分析可能会把一些 2.95 不支持的语法标成绿色波浪线但这不影响实际编译。如果觉得干扰可以在.vscode\c_cpp_properties.json里把includePath指向 mingw32 2.95 的include目录让插件的分析也基于老头文件。5.4 验证编译产物是否真的兼容目标环境编译出 exe 只是第一步最终要在目标机器上跑。我习惯用objdump检查 exe 的导入表确认它依赖哪些 DLL。mingw32 2.95 的bin目录下有objdump.exe命令是objdump -p app.exe | findstr DLL Name如果输出里只有KERNEL32.dll、USER32.dll、msvcrt.dll这些系统库说明静态链接成功部署时只需要 exe 本身。如果出现libstdc-3.dll或libgcc-3.dll就需要把这些 DLL 一起拷贝到目标机器。另外用objdump -h app.exe可以看节区信息确认没有异常的节区名。这些检查做完再拿到目标机器上跑基本不会出现“编译通过但运行不了”的玄学问题。5.5 一个具体技巧用-Wl,--allow-multiple-definition绕过重复符号老项目里经常出现多个.o文件定义了同一个符号的情况现代链接器默认报错但 mingw32 2.95 的ld可以通过-Wl,--allow-multiple-definition让链接器取第一个定义忽略后面的重复。这个选项在链接第三方静态库时特别有用因为那些库可能是用不同编译器版本编的符号重复在所难免。用法g -o app.exe obj\*.o -Wl,--allow-multiple-definition -static注意这个选项只是让链接通过不解决符号重复背后的逻辑问题。如果重复的符号是全局变量运行时可能出现数据不一致。我一般只在确认重复符号是只读常量或者函数定义时才用这个选项变量重复还是老老实实改代码。这套工具链我用了很多年最大的教训是不要试图用现代 C 的思维去写 mingw32 2.95 能编译的代码。模板元编程、auto、范围for、nullptr这些统统不存在连//注释在 C89 模式下都可能被警告。每次新建源文件我都会在文件头写一行/* gcc 2.95 compatible */提醒自己。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

基于Spring MVC注解与拦截器的通用数据权限校验框架设计与实践

基于Spring MVC注解与拦截器的通用数据权限校验框架设计与实践

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

2026/10/13 1:28:07 阅读更多 →
Python天气预测毕业设计:爬虫、LSTM与可视化完整实战

Python天气预测毕业设计:爬虫、LSTM与可视化完整实战

简介:基于Python的天气预测和可视化项目,是一套面向计算机专业毕业设计、课程设计与期末大作业的高分完整方案,评审成绩达99分,代码完整可运行,适合从零开始实战项目的学生。压缩包共38个文件,包含Python源…

2026/10/13 1:28:07 阅读更多 →
PNN在变压器故障诊断中的小样本鲁棒应用

PNN在变压器故障诊断中的小样本鲁棒应用

简介:本资源是一套基于MATLAB实现的概率神经网络(PNN)用于变压器故障诊断的完整实践方案,面向电力系统自动化、智能运维及人工智能应用方向的本科生、研究生与工程技术人员。项目聚焦于利用PNN对变压器运行状态进行分类识别&#…

2026/10/13 1:28:07 阅读更多 →

最新新闻

老版本旅游CMS手机端模块app_mobilelbs兼容性修复与渐进式替换实战

老版本旅游CMS手机端模块app_mobilelbs兼容性修复与渐进式替换实战

简介:这份资源是思途旅游CMS V6.0手机端模块app_mobilelbsV5.0等老版本通用的破解版源码包,面向旅游行业开发者、二次开发人员及中小旅行社技术团队,用于搭建线路管理、酒店预订、门票销售、租车服务与用户管理等一体化后台系统。压缩包共126…

2026/10/13 2:19:28 阅读更多 →
hugo-theme-academic-cv 实战:Hugo Blox 项目结构、站点配置与内容格式化完整指南

hugo-theme-academic-cv 实战:Hugo Blox 项目结构、站点配置与内容格式化完整指南

前端 【免费下载链接】hugo-theme-academic-cv 🎓 Academic portfolio that boosts citations. AI generates pages, you own as Markdown. BibTeX auto-import, Jupyter, LaTeX, slides, visual block editor — free to host forever. 学术主页,AI 生成…

2026/10/13 2:19:27 阅读更多 →
燃气安全新国标落地:从单点报警到智慧互联的系统设计与实践

燃气安全新国标落地:从单点报警到智慧互联的系统设计与实践

燃气行业这两年最大的变化,不是设备外观变得多高级,而是“燃气安全新国标落地”这件事,把整个行业的游戏规则彻底改写了一遍。过去我们聊燃气报警,默认就是“厨房墙上挂一个探测器,响了再说”,本质上是个单…

2026/10/13 2:19:27 阅读更多 →
MCP工具错误排查:三条探针定位错误传输通道

MCP工具错误排查:三条探针定位错误传输通道

你是不是也遇到过这种情况:MCP 工具在自己的测试脚本里跑得好好的,一接进宿主端就“失灵”,页面既不显示错误,也不返回数据,看起来就像工具从来没执行过。更气人的是,你把同样的入参丢回本地脚本&#xff0…

2026/10/13 2:19:27 阅读更多 →
lakeFS Python SDK 认证令牌 AuthenticationToken:JWT 登录令牌模型与实战指南

lakeFS Python SDK 认证令牌 AuthenticationToken:JWT 登录令牌模型与实战指南

数据工程数据湖大数据对象存储后端 【免费下载链接】lakeFS lakeFS - Data version control for your data lake | Git for data 项目地址: https://gitcode.com/gh_mirrors/la/lakeFS 点击查看 免费下载 本篇技术指南聚焦 lakeFS Python SDK(lakefs_sd…

2026/10/13 2:19:27 阅读更多 →
Reclilisib:从PI3K激动剂到选择性辐射保护剂的双重角色

Reclilisib:从PI3K激动剂到选择性辐射保护剂的双重角色

做肿瘤放疗研究的朋友应该都有过这种纠结:治疗窗口太窄,射线过去,肿瘤细胞和正常组织一起遭殃。我们这些年一直在找"选择性辐射保护剂"——最好能保护正常细胞,却不给肿瘤细胞留活路。我第一次注意到Reclilisib&#xf…

2026/10/13 2:18:27 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →