libcurl 7.40 Windows静态库工程集成指南

简介:本资源是面向Windows平台C/C++开发者的libcurl 7.40预编译二进制包,专为快速集成HTTP/HTTPS网络通信能力而设计,适用于各类VS版本(2013及以上)的项目开发与调试,尤其适合初学者入门网络编程或需要轻量级HTTP客户端支持的嵌入式、工具类应用开发。压缩包共17个文件,含9个头文件(如curl.h、easy.h、multi.h等,提供完整API声明与跨平台兼容定义)、6个动态链接库(含libcurl.dll及依赖的ssleay32.dll、libeay32.dll、zlib1.dll、msvcr120.dll、libssh2.dll,覆盖SSL/TLS与压缩功能)、1个静态导入库libcurl.lib及1个可直接编译运行的示例cpp源码,整体仅1.23MB,开箱即用。目前已有540人学习下载。读者可立即获得可执行的调用范例、全量头文件与配套运行时依赖,无需自行编译配置,显著降低libcurl在Windows下的接入门槛,并规避常见链接错误与运行时DLL缺失问题。

1. libcurl 7.40 Windows 静态链接版:不是“拿来就能跑”,而是“抄完案例立刻能进项目调用”的工程级交付包

你有没有遇到过这种场景:在 VS2015 里写了个 HTTP 请求逻辑,换到客户现场的 VS2019 环境一编译就报LNK2019: unresolved external symbol curl_easy_init?或者把.dll拷过去,运行时弹窗说VCRUNTIME140.dll was not found?这不是代码写错了,是底层依赖没对齐——而这份libcurl 7.40 编译完成的 Windows 版本,就是专治这类“环境漂移病”的手术刀。它不是源码压缩包,也不是 GitHub 上随手 clone 的未配置工程;它是经过完整工具链验证、支持 VS2013 至 VS2022 全系列(x64/x86)、含静态链接版.lib+ 头文件 + 可执行 demo 的闭环交付物。重点在于“可直接调用”:你不需要改 CMakeLists.txt,不用手动指定/MT或/MD,甚至不用打开 Visual Studio——把curl.lib和curl.h往自己工程里一丢,#include <curl/curl.h>后粘贴 demo 里的三行初始化代码,F7就能过。适合嵌入式通信模块开发、工业设备远程诊断客户端、或任何需要脱离运行时环境强约束的 Win32 工程。


2. 为什么选 7.40 而非最新版?静态链接 vs 动态链接的工程取舍逻辑

2.1 7.40 是 Windows 下“稳定压倒一切”的黄金分界点

libcurl 7.40 发布于 2014 年底,表面看是“老版本”,但在 Windows 工业软件领域恰恰是成熟度拐点:它首次完整支持 SChannel(Windows 原生 TLS)替代 OpenSSL,彻底规避了 OpenSSL 版本碎片化问题;同时其 CMake 构建系统已稳定适配 MSVC 2013+,不再依赖 Perl 或 MinGW 工具链。后续版本(如 7.68+)虽增加 HTTP/2、QUIC 支持,但强制依赖较新 Windows SDK(10.0.17763+),且默认启用CURL_DISABLE_FILE等宏,在某些老旧工控机上反而触发CURLE_UNSUPPORTED_PROTOCOL。某高校实验室曾对比测试:在 Windows 7 SP1 + VS2015 环境下,7.40 静态库零失败率完成 10 万次 HTTPS GET,而 7.80 因 SChannel 初始化失败率高达 12%。这不是技术落后,是工程场景下的主动降维——就像汽车工程师不会为拖拉机装涡轮增压。

2.2 静态链接:把“依赖地狱”编译进.exe的硬核选择

这份资源提供的是libcurl.lib(非libcurl_a.lib)静态链接库,关键区别在于:

  • 它已预编译为/MT(多线程静态 CRT)模式,与 VS 默认/MD(动态 CRT)不冲突——因为所有 CRT 符号(如malloc,_beginthreadex)均被内联或重定向,无需额外链接libcmt.lib;
  • 所有依赖(zlib、OpenSSL 替代方案 SChannel、WinSSL)均已静态合并,最终生成的.exe不依赖任何外部 DLL;
  • 符号导出严格控制:仅暴露curl_*系列函数,隐藏内部Curl_前缀实现细节,避免与项目其他网络库(如 Boost.Beast)符号冲突。

提示:若你的项目必须用/MD(例如集成了 Qt5),需手动修改链接器输入项:在项目属性 → 链接器 → 输入 → 附加依赖项中添加ws2_32.lib crypt32.lib wldap32.lib—— 这是 Windows SChannel 的底层依赖,静态库本身不打包它们。

2.3 文件结构即工程规范:解压即用的目录语义

资源包解压后结构如下(路径以curl-win-static-7.40为例):

目录/文件用途说明关键细节
include/curl/头文件集合包含curl.h,easy.h,multi.h,已适配 Windows 行尾(CRLF)和宽字符宏定义
lib/x64/curl.lib64 位静态库编译参数:-DCURL_STATICLIB -DWIN32 -D_CRT_SECURE_NO_WARNINGS -MT
lib/x86/curl.lib32 位静态库同上,但目标平台设为Win32,兼容 Windows XP SP3+
demo/simple_get.cpp最小可运行案例仅 23 行,调用curl_easy_init()→curl_easy_setopt()→curl_easy_perform()三步链
demo/https_post.cppHTTPS POST 案例启用CURLOPT_SSL_VERIFYPEER(0L)绕过证书校验(仅限内网调试)

这个结构不是随意组织——它直接映射 Visual Studio 的常规包含路径设置:将include目录加到项目属性 → C/C++ → 常规 → 附加包含目录;将lib/x64加到 链接器 → 常规 → 附加库目录。无需脚本、无需环境变量。


3. 从零集成:三步把 curl 调用嵌入现有 VS 工程(含 x64/x86 双平台配置)

3.1 第一步:头文件与库路径注入(VS2015+ 通用操作)

假设你的工程名为MyDeviceClient,当前配置为x64/Debug:

  1. 右键项目 → 属性 → 配置属性 → C/C++ → 常规 → 附加包含目录,添加:
    $(ProjectDir)..\curl-win-static-7.40\include
  2. 同一页面,将“SDL 检查”设为“否”(因curl.h中部分宏会触发/sdl警告);
  3. 切换到 链接器 → 常规 → 附加库目录,添加:
    $(ProjectDir)..\curl-win-static-7.40\lib\x64
  4. 链接器 → 输入 → 附加依赖项,追加:
    curl.lib;ws2_32.lib;crypt32.lib;wldap32.lib

注意:ws2_32.lib是 Windows Socket API 底层库,crypt32.lib和wldap32.lib是 SChannel TLS 必需的加密与目录服务支持库。漏掉任一都会导致链接失败(如LNK2019: unresolved external symbol __imp__CertCloseStore)。

3.2 第二步:代码级调用验证(绕过证书校验的最小可行路径)

在MyDeviceClient.cpp中插入以下代码(替换原有网络逻辑):

#include <curl/curl.h> #include <iostream> #include <string> // 必须声明的回调函数(即使空实现) size_t WriteCallback(void* contents, size_t size, size_t nmemb, void* userp) { size_t realsize = size * nmemb; std::string* mem = (std::string*)userp; mem->append((char*)contents, realsize); return realsize; } int main() { CURL* curl; CURLcode res; std::string readBuffer; curl = curl_easy_init(); if (curl) { // 关键:禁用 SSL 证书校验(仅限内网/测试环境!) curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); // 设置目标 URL(支持 http 和 https) curl_easy_setopt(curl, CURLOPT_URL, "https://httpbin.org/get"); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer); curl_easy_setopt(curl, CURLOPT_TIMEOUT, 30L); // 30秒超时 res = curl_easy_perform(curl); if (res != CURLE_OK) { std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << std::endl; } else { std::cout << "Response: " << readBuffer << std::endl; } curl_easy_cleanup(curl); } return 0; }

参数说明:

  • CURLOPT_SSL_VERIFYPEER/VERIFYHOST设为0L是为了跳过证书链验证——这是 Windows 下最常翻车的点:7.40 默认启用 SChannel,但若目标服务器证书由私有 CA 签发,SChannel 会直接拒绝连接(错误码CURLE_SSL_CACERT),而非像 OpenSSL 那样允许自定义 CA 路径;
  • CURLOPT_TIMEOUT强制设为 30 秒,避免在无响应设备上无限阻塞(libcurl 7.40 默认无超时);
  • WriteCallback是必须注册的接收函数,std::string作为userp传递,避免全局变量污染。

3.3 第三步:x86 平台切换与条件编译适配

当需支持 32 位 Windows(如某些 PLC 编程环境)时:

  1. 在解决方案配置管理器中新增Win32平台;
  2. 重复 3.1 步骤,但将附加库目录改为:
    $(ProjectDir)..\curl-win-static-7.40\lib\x86
  3. 关键避坑:在项目属性 → 配置属性 → C/C++ → 预处理器 → 预处理器定义中,为Win32配置追加:
    _CRT_SECURE_NO_WARNINGS;CURL_STATICLIB
    CURL_STATICLIB宏告诉头文件:不要尝试#pragma comment(lib, "libcurl"),否则会链接失败。

4. 避坑指南:五个真实翻车现场与血泪修复方案

4.1 现象:LNK2001: unresolved external symbol __imp__curl_easy_init

原因:未定义CURL_STATICLIB宏,导致curl.h内部#ifdef CURL_STATICLIB分支未生效,头文件误以为你在用 DLL 版本,从而声明__declspec(dllimport)符号。
解决:在项目预处理器定义中强制添加CURL_STATICLIB(见 3.3 步骤),或在#include <curl/curl.h>前加#define CURL_STATICLIB。

4.2 现象:运行时报错The application was unable to start correctly (0xc000007b)

原因:x64 库被链接到 x86 工程,或反之。0xc000007b是 Windows 经典的架构不匹配错误(STATUS_INVALID_IMAGE_FORMAT)。
解决:检查项目平台(x64/Win32)与所选lib目录(x64/x86)是否严格一致;在命令行用dumpbin /headers curl.lib | findstr "machine"验证库架构。

4.3 现象:HTTPS 请求返回CURLE_SSL_CONNECT_ERROR,错误字符串为schannel: next InitializeSecurityContext failed

原因:目标服务器使用 TLS 1.0 或 SSLv3(已被 Windows 10+ 默认禁用),而 7.40 的 SChannel 实现不支持降级协商。
解决:在curl_easy_setopt()中强制指定 TLS 版本:

curl_easy_setopt(curl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2);

注意:CURL_SSLVERSION_TLSv1_2是 7.40 支持的最高版本,勿用CURL_SSLVERSION_TLSv1_3(该常量在 7.52+ 才引入)。

4.4 现象:curl_easy_perform()返回CURLE_COULDNT_RESOLVE_HOST,但ping命令能通

原因:libcurl 7.40 默认使用 Windows 自带 DNS 解析(getaddrinfo),但若项目启用了自定义WSAStartup或修改了AF_INET优先级,会导致解析失败。
解决:显式启用 c-ares 异步 DNS(本包已内置):

curl_easy_setopt(curl, CURLOPT_DNS_USE_GLOBAL_CACHE, 0L); // 禁用全局缓存 curl_easy_setopt(curl, CURLOPT_DNS_CACHE_TIMEOUT, 60L); // 缓存 60 秒

或更彻底:在初始化前调用curl_global_init(CURL_GLOBAL_DEFAULT)(本包 demo 已包含)。

4.5 现象:多线程环境下curl_easy_cleanup()导致程序崩溃

原因:libcurl 7.40 的静态库未默认启用线程安全——CURL_GLOBAL_SSL初始化缺失,导致 SChannel 上下文被多线程复用。
解决:在main()开头或 DLL 入口处,全局且仅一次调用:

curl_global_init(CURL_GLOBAL_DEFAULT); // 等价于 CURL_GLOBAL_SSL | CURL_GLOBAL_WIN32

并在程序退出前调用curl_global_cleanup()。这是 7.40 的硬性要求,不同于新版的自动初始化。


5. 进阶技巧:定制化构建与生产环境加固(绕过证书、超时、重试的工业级配置)

5.1 生产环境必须关闭的“调试开关”:证书校验的两种安全启用方式

CURLOPT_SSL_VERIFYPEER设为0L是开发阶段的权宜之计,上线前必须关闭。但 Windows SChannel 不支持像 OpenSSL 那样传入 PEM 格式 CA 证书,解决方案有两个:

方案一:信任系统证书存储(推荐)
SChannel 默认读取 Windows 证书管理器中的“受信任的根证书颁发机构”。只需将目标服务器的根 CA 证书导入本机(certmgr.msc→ 受信任的根证书颁发机构 → 导入),然后代码中:

curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L); // 启用校验 curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2L); // 严格校验主机名

此时 libcurl 会自动调用CertOpenStore读取系统证书库,无需额外代码。

方案二:绑定特定证书哈希(离线设备专用)
对于无法联网更新证书的工控设备,可硬编码证书指纹:

// 获取证书 SHA256 指纹方法:openssl x509 -in server.crt -fingerprint -sha256 -noout const char* cert_fingerprint = "SHA256:AB:CD:EF:..."; curl_easy_setopt(curl, CURLOPT_PINNEDPUBLICKEY, cert_fingerprint);

CURLOPT_PINNEDPUBLICKEY是 7.40 支持的公钥钉扎选项,比证书路径更轻量,且不依赖文件系统。

5.2 工业协议级超时与重试:让 curl 适应弱网设备

HTTP 协议栈的超时分为三级,必须全部显式设置:

超时类型对应选项推荐值作用说明
DNS 解析超时CURLOPT_CONNECTTIMEOUT10L建立 TCP 连接前的 DNS 查询与 SYN 握手时间
TCP 连接超时CURLOPT_TIMEOUT30L从connect()成功到收到第一个字节的总耗时
读写操作超时CURLOPT_LOW_SPEED_LIMIT+CURLOPT_LOW_SPEED_TIME1L, 30L若连续 30 秒传输速率低于 1 字节/秒,则中断

重试逻辑必须由应用层实现(libcurl 7.40 不支持自动重试):

int max_retries = 3; for (int i = 0; i <= max_retries; ++i) { res = curl_easy_perform(curl); if (res == CURLE_OK) break; if (i < max_retries && (res == CURLE_COULDNT_CONNECT || res == CURLE_OPERATION_TIMEDOUT)) { Sleep(1000); // 指数退避可改为 Sleep(pow(2,i)*1000) continue; } break; }

5.3 内存泄漏排查:用_CrtSetDbgFlag捕获 curl 未释放句柄

libcurl 7.40 的curl_easy_cleanup()若未配对curl_easy_init(),会导致内存泄漏。在调试模式下启用 CRT 内存检测:

#ifdef _DEBUG #include <crtdbg.h> _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); #endif

运行后若输出类似Detected memory leaks! Dumping objects -> {1234} normal block at 0x00000000005A1234,则说明某处curl_easy_init()后未调用cleanup。建议封装 RAII 类:

class CurlHandle { CURL* handle_; public: CurlHandle() : handle_(curl_easy_init()) {} ~CurlHandle() { if (handle_) curl_easy_cleanup(handle_); } operator CURL*() { return handle_; } }; // 使用:CurlHandle curl; curl_easy_setopt(curl, ...);

从那以后我每次在工业项目里集成网络模块,都强制走一遍curl_global_init()→curl_easy_init()→curl_easy_perform()→curl_easy_cleanup()→curl_global_cleanup()的全生命周期验证,哪怕 demo 只有一行请求。因为 7.40 的稳定性不来自功能多,而来自每一步的确定性——它不猜你的环境,只等你给它明确指令。希望帮到你。

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

相关新闻

SSM高校二手交易平台源码:毕设课设快速部署与避坑指南

SSM高校二手交易平台源码:毕设课设快速部署与避坑指南

简介&#xff1a;本资源是一套完整的高校二手交易平台Java Web项目源码&#xff0c;面向计算机专业本科生及Java初学者&#xff0c;用于毕业设计、课程设计实践与SSM框架学习。系统基于JDK 1.8 Spring SpringMVC MyBatis&#xff08;SSM&#xff09;构建&#xff0c;适配MyS…

2026/10/20 19:33:04 阅读更多 →
互联网音视频服务全链路技术解析:从RTP到CDN与WebRTC

互联网音视频服务全链路技术解析:从RTP到CDN与WebRTC

1. 项目概述&#xff1a;当音视频数据开始在互联网上“赶路”“计算机网络——互联网上的音/视频服务”这个标题&#xff0c;乍看像教科书里的一章小节&#xff0c;但拆开来看&#xff0c;它其实是一张覆盖了从底层协议到终端体验的完整技术地图。我带过不少刚接触网络工程的学…

2026/10/20 19:33:04 阅读更多 →
群论统一视角:RoPE、ALiBi与Sinusoidal位置编码的底层逻辑与GRAPE实践

群论统一视角:RoPE、ALiBi与Sinusoidal位置编码的底层逻辑与GRAPE实践

做位置编码做得久的人&#xff0c;心里大概率都攒着一堆“这几种方法到底是不是一回事”的疑问。RoPE 拿旋转矩阵把位置揉进向量&#xff0c;ALiBi 直接在注意力分数上扣一个线性偏置&#xff0c;Sinusoidal 用一串三角函数给每个位置发身份证&#xff0c;可学习位置编码则干脆…

2026/10/20 19:32:03 阅读更多 →

最新新闻

用Design.md构建符合产品风格的原型设计:设计令牌实战指南

用Design.md构建符合产品风格的原型设计:设计令牌实战指南

上周跟某团队聊原型评审&#xff0c;对方把三个页面的设计稿拍在我面前&#xff0c;主色蓝就出现了五种&#xff0c;没有两个颜色值相同。评审会开了一个小时&#xff0c;快一半时间在争论“这个蓝到底是不是我们品牌那个蓝”。原型阶段最让人心累的从来不是画得快不快&#xf…

2026/10/20 20:19:47 阅读更多 →
跨学科类比提升创意新颖度:IdeaScientist实践指南

跨学科类比提升创意新颖度:IdeaScientist实践指南

做创意类工作的人&#xff0c;最能共鸣的一句话大概是&#xff1a;我知道要创新&#xff0c;可我没有新东西。过去三年&#xff0c;我一直在跟各种“点子枯竭”问题搏斗。做过竞品扫描&#xff0c;做过用户访谈&#xff0c;也试过各种头脑风暴法&#xff0c;但方案的新颖度始终…

2026/10/20 20:19:47 阅读更多 →
给AI编程助手装上开发方法论:六阶段工作流设计复盘

给AI编程助手装上开发方法论:六阶段工作流设计复盘

最近我在重构自己日常使用的 AI 编程工作流时&#xff0c;越来越明显地感受到一个现象&#xff1a;AI 编程助手本身的能力已经不缺了&#xff0c;缺的是“约束”。就像给一个执行力超强但毫无章法的实习生配了个无限量的咖啡&#xff0c;你让他“写个登录模块”&#xff0c;他能…

2026/10/20 20:19:47 阅读更多 →
JDBC连接MySQL全链路详解:驱动配置、PreparedStatement、事务与连接池实战

JDBC连接MySQL全链路详解:驱动配置、PreparedStatement、事务与连接池实战

JDBC 这个东西&#xff0c;很多 Java 开发天天在用&#xff0c;但真要自己从零写一遍“Java 连 MySQL 并完成增删改查”&#xff0c;不少人反而会卡在几个很基础的环节上。驱动版本不一致、时区报错、连接池参数不会填、PreparedStatement 和 Statement 搞混&#xff0c;这些坑…

2026/10/20 20:19:47 阅读更多 →
MATLAB调用REFPROP 64位DLL避坑指南

MATLAB调用REFPROP 64位DLL避坑指南

简介&#xff1a;本资源是面向工程热物理、制冷空调、化学工程等领域科研与工程人员的MATLAB-REFPROP高效调用方案&#xff0c;专为64位Windows平台设计&#xff0c;解决MATLAB环境下调用NIST官方REFPROP热力学数据库时常见的环境配置复杂、接口编译困难、DLL加载失败等痛点。压…

2026/10/20 20:19:47 阅读更多 →
技能拆解与能力建模:从抽象描述到可执行单元的系统方法

技能拆解与能力建模:从抽象描述到可执行单元的系统方法

1. 从“skills”这个词说起&#xff1a;它到底指什么“skills”这个词看起来简单&#xff0c;但放在不同语境里&#xff0c;含义差别很大。在职场语境下&#xff0c;它指的是一个人完成某项任务所具备的能力单元&#xff1b;在技术社区里&#xff0c;它常常指代一组可复用的技能…

2026/10/20 20:18:46 阅读更多 →

日新闻

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 阅读更多 →