libnfc 1.7 + VS2010:Windows NFC开发的最小可行编译单元
简介本资源是面向Windows平台NFC开发初学者与嵌入式C/C工程师的libnfc实战项目聚焦于libnfc 1.7版本在Visual Studio 2010环境下的完整集成与基础功能验证。项目核心涵盖NFC设备初始化、UID读取及UID模拟两大关键操作特别适配PN532等UART接口NFC芯片为支付终端、门禁模拟、标签仿真等应用场景提供可运行的底层代码参考。压缩包共77个文件含14个C源码如nfc-emulate-uid.c、pn532_uart.c、12个头文件含nfc.h、pn53x.h等协议层定义、13个编译中间文件obj及1个可执行exe辅以sln工程文件、vcxproj配置和调试用pdb/manifest结构完整开箱即调。资源大小5.43MB轻量易部署。已有240人学习下载读者可直接获取VS2010工程全源码、NFC通信分层实现逻辑、UID模拟的固定字节约束说明首位0x08及典型错误处理片段快速掌握libnfc跨平台移植与基础指令交互方法。1. libnfc 1.7 VS2010不是“装上就能用”的 NFC 开发套件而是 Windows 桌面端 NFC 应用落地的最小可行编译单元你手头有一块 PN532 或 ACS ACR122U想在 Windows 上写个读卡器 Demo查资料发现 libnfc 是绕不开的底层库——但一搜 “libnfc windows”满屏都是“编译失败”“找不到 nfc.dll”“LNK2019 未解析外部符号”。问题不在你而在 libnfc 官方早已停止维护 Windows Visual Studio 构建链。libnfc1.7_VS2010这个包就是某高校嵌入式实验室在 2013 年前后为支撑毕业设计而沉淀下来的、唯一完整保留了 VS2010 工程文件.sln / .vcproj、预编译静态库.lib、配套头文件与可执行示例nfc-poll.exe / nfc-list.exe的离线构建快照。它不提供跨平台抽象层不封装 USB HID 协议细节也不做驱动签名兼容性兜底它只做一件事让nfc_init()在 Windows 7/8 VS2010 环境下真正返回非 NULL。适合正在调试 NFC 设备通信链路、需要查看原始 APDU 流、或必须复现某段遗留 C 工程的开发者。如果你的目标是 Python 快速原型或 Win10 UWP 应用请绕行——这不是 SDK这是“能跑通的第一块砖”。2. 编译环境还原为什么必须是 VS2010从 CRT 版本、USB 栈依赖到 libusb-1.0 的 ABI 锁定2.1 VS2010 不是怀旧而是 CRT 与 USB 驱动栈的硬性对齐点libnfc 1.7 的 Windows 移植层深度绑定于 Microsoft Visual C 2010 运行时v100。其源码中大量使用__try/__except结构处理 USB 控制传输异常该语法在 VS2012 中被标记为 deprecated且生成的.lib文件导出符号表与 MSVCRT 版本强耦合。若强行用 VS2015 打开工程链接器会报错error LNK2001: unresolved external symbol __imp___invalid_parameter error LNK2001: unresolved external symbol __imp____stdio_common_vfscanf根本原因在于VS2010 使用msvcr100.dll而 VS2015 使用vcruntime140.dll二者 ABI 不兼容。libnfc1.7_VS2010包内所有.lib文件libnfc.lib,libusb-1.0.lib均以/MTd多线程静态调试版编译确保不依赖目标机安装的 VC 运行时——这是工业现场部署的关键。2.2 USB 通信栈的三重依赖libusb-1.0 → WinUSB → 设备描述符匹配libnfc 在 Windows 下不直接调用 Win32 API而是通过libusb-1.0封装 USB 通信。libnfc1.7_VS2010包中包含的libusb-1.0.lib是2012 年 1.0.12 版本的定制编译体关键修改点有二禁用libusb默认的WinUSB自动加载逻辑因其在 Windows 7 SP1 后存在句柄泄漏改用显式SetupDi枚举 CreateFile打开设备路径重写libusb_get_device_descriptor()跳过libusb原生的GetDeviceDescriptor调用直接解析设备USB_DEVICE_DESCRIPTOR结构体——因某些 NFC 设备如部分国产 PN532 模块在枚举阶段返回错误的 bcdUSB 字段导致原生libusb拒绝识别。提示该包附带Zadig_2.2.exe2012 年版本仅用于将 NFC 设备驱动强制切换为WinUSB。新版 Zadig 因签名策略变更无法在未启用测试模式的 Win7/8 上操作设备。2.3 头文件与宏定义的隐式契约HAVE_LIBUSB_1_0与WIN32_LEAN_AND_MEANlibnfc1.7_VS2010的nfc.h中存在两处关键宏控制// nfc.h 第 42 行 #ifndef HAVE_LIBUSB_1_0 # define HAVE_LIBUSB_1_0 1 // 强制启用 libusb-1.0 后端 #endif // nfc.h 第 58 行 #ifndef WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN // 避免 winsock1.h 冲突因 libnfc 不用网络 #endif若在自定义工程中遗漏HAVE_LIBUSB_1_0定义nfc_driver.c会走回已废弃的libusb-0.1分支导致nfc_open()返回NULL。此宏必须在#include nfc/nfc.h之前定义或在项目属性 → C/C → 预处理器 → 预处理器定义中添加。3. 工程结构解剖从 .sln 到 .exe看清每个文件的真实角色3.1 根目录文件清单与功能映射文件名类型作用说明是否可删libnfc.slnVS2010 解决方案包含libnfc静态库、nfc-tools命令行工具、nfc-examples示例三个项目否启动入口libnfc.lib静态库libnfc 核心逻辑含nfc_init(),nfc_open(),nfc_target_init()等否链接必需libusb-1.0.lib静态库定制版 libusb-1.0已打补丁修复 PN532 枚举问题否USB 通信基础nfc-poll.exe可执行文件主动轮询 NFC 标签输出 UID、ATR、ATS 等原始数据是仅调试用nfc-list.exe可执行文件列出当前连接的 NFC 设备及驱动状态是诊断用include/目录nfc/nfc.h,nfc/nfc-types.h等头文件含完整函数声明否编译必需drivers/目录pn53x_usb.c,acr122_usb.c等驱动实现含 USB 端点地址硬编码否设备支持核心3.2nfc-tools项目的关键配置项打开nfc-tools.vcproj需确认以下三处设置VS2010 界面路径右键项目 → 属性 → 配置属性常规 → 输出目录$(SolutionDir)bin\—— 确保nfc-poll.exe与libnfc.dll若动态链接同目录C/C → 附加包含目录$(SolutionDir)include;$(SolutionDir)libusb\include—— 让编译器找到nfc.h和libusb.h链接器 → 输入 → 附加依赖项libnfc.lib;libusb-1.0.lib;setupapi.lib;ws2_32.lib——setupapi.lib用于SetupDi设备枚举ws2_32.lib为gethostbyname等网络函数预留虽未用但 libnfc 源码中存在条件编译引用。注意该工程默认以/MTd多线程静态调试编译若需发布 Release 版须同步修改C/C → 代码生成 → 运行时库为/MT并重新编译libnfc.lib和libusb-1.0.lib否则链接时会因 CRT 混用报错。3.3drivers/pn53x_usb.c中的 USB 端点硬编码真相PN532 设备在 WinUSB 模式下暴露两个端点0x01OUT发送命令如InListPassiveTarget0x81IN接收响应如InListPassiveTarget返回的 UID。libnfc1.7_VS2010的pn53x_usb.c第 217 行明确写死#define PN53X_USB_ENDPOINT_IN 0x81 #define PN53X_USB_ENDPOINT_OUT 0x01此值来自设备描述符中的bEndpointAddress字段。若你使用的 PN532 模块如某国产 USB 转串口版实际端点为0x82/0x02则必须手动修改此处并重新编译libnfc.lib否则nfc_initiator_transceive_bytes()永远超时。4. 避坑指南五个血泪经验总结的高频翻车点与排查路径4.1 现象nfc_open()返回NULLnfc_strerror()输出Unable to open NFC device原因设备未正确切换至 WinUSB 驱动或libusb枚举时因描述符异常跳过设备。解决运行包内Zadig_2.2.exe选择对应 NFC 设备如ACS ACR122UDriver 选WinUSB点Replace Driver拔插设备在设备管理器中确认其位于Universal Serial Bus devices下且无黄色感叹号运行nfc-list.exe若输出为空则用USBView.exeWindows Driver Kit 工具检查设备是否被系统识别为USB Composite Device若是需在drivers/acr122_usb.c中修改acr122_usb_match_device()函数增加对bInterfaceClass 0xFF的匹配。4.2 现象nfc-poll.exe运行后卡在NFC reader: ACS ACR122U opened.无后续输出原因ACR122U 的bInterfaceNumber在不同固件版本中可能为0或1而acr122_usb.c第 156 行硬编码为0if (usb_interface-bInterfaceNumber ! 0) continue; // ← 此处需根据实际修改解决用USBView.exe查看设备接口号若为1则将! 0改为! 1重新编译libnfc.lib。4.3 现象编译通过但运行时报错The application was unable to start correctly (0xc000007b)原因32/64 位架构错配。libnfc1.7_VS2010全部为Win32x86平台编译若在 64 位系统上运行必须确保VS2010 项目配置为Win32而非x64Zadig_2.2.exe为 32 位版本包内即为此版设备管理器中驱动属性显示为x86。解决在 VS2010 顶部菜单栏 →生成→配置管理器→ 将活动解决方案平台设为Win32。4.4 现象nfc-poll.exe读取 MIFARE Classic 卡时返回Operation timeout原因MIFARE Classic 卡需先进行密钥认证而nfc-poll.exe仅执行InListPassiveTarget不触发MifareAuthent。解决这不是 bug而是工具定位决定的。若需认证应调用nfc_initiator_mifare_cmd()参考包内nfc-examples/mifare-classic-read.c示例其中第 89 行调用if (nfc_initiator_mifare_cmd(pnd, MC_AUTH_A, 0x04, abtKeyA, nt)) { // 认证成功后读块 }abtKeyA需设为0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF默认密钥。4.5 现象在 Windows 10 上运行nfc-poll.exe报libusb: error [winusbx] GetOverlappedResult failed原因Windows 10 对 WinUSB 的权限模型收紧libusb-1.0.12的异步传输回调未适配新内核。解决以管理员身份运行nfc-poll.exe或在libnfc.conf需手动创建于C:\Program Files\libnfc\中添加allow_intrrupt_transfer false强制禁用中断传输改用控制传输模拟——牺牲性能换取兼容性。5. 实战从零构建一个带 UID 日志的 NFC 读卡器C 控制台程序5.1 创建新工程并集成 libnfcVS2010 → 新建项目 → Win32 控制台应用程序 → 名称nfc-logger右键项目 → 属性 → 配置属性 → 常规 → 配置类型 →应用程序(.exe)C/C → 附加包含目录 → 添加$(SolutionDir)..\libnfc1.7_VS2010\include链接器 → 常规 → 附加库目录 → 添加$(SolutionDir)..\libnfc1.7_VS2010\链接器 → 输入 → 附加依赖项 →libnfc.lib;libusb-1.0.lib;setupapi.lib。5.2 核心代码捕获 UID 并写入日志文件// nfc-logger.cpp #include nfc/nfc.h #include stdio.h #include stdlib.h #include time.h int main(int argc, char *argv[]) { nfc_context *context; nfc_device *pnd; nfc_target nt; FILE *log_file; // 初始化 libnfc 上下文 nfc_init(context); if (context NULL) { fprintf(stderr, Unable to init libnfc (malloc)\n); return -1; } // 尝试打开第一个可用 NFC 设备 pnd nfc_open(context, NULL); if (pnd NULL) { fprintf(stderr, Unable to open NFC device\n); nfc_exit(context); return -1; } printf(NFC reader: %s opened.\n, nfc_device_get_name(pnd)); // 打开日志文件追加模式 log_file fopen(nfc_log.txt, a); if (!log_file) { fprintf(stderr, Cannot open log file\n); nfc_close(pnd); nfc_exit(context); return -1; } // 主循环持续轮询 while (true) { // 轮询被动目标ISO14443A/B, FeliCa, Jewel if (nfc_initiator_poll_target(pnd, NM_ISO14443A, 0, 1, nt) 0) { // 成功获取目标打印 UID char uid_str[128] {0}; for (size_t i 0; i nt.nti.nai.szUidLen; i) { sprintf(uid_str strlen(uid_str), %02X, nt.nti.nai.abtUid[i]); } time_t now time(NULL); fprintf(log_file, [%s] UID: %s\n, ctime(now), uid_str); fflush(log_file); // 立即写入磁盘 printf(Card detected: %s\n, uid_str); // 短暂延时避免重复记录同一张卡 Sleep(2000); } else { // 无卡时休眠 500ms 降低 CPU 占用 Sleep(500); } } fclose(log_file); nfc_close(pnd); nfc_exit(context); return 0; }关键参数说明NM_ISO14443A指定只轮询 ISO14443-A 类型卡MIFARE Classic/UL/Desfire避免与 FeliCa 卡冲突0uiPollNr轮询次数为 0 表示无限轮询1uiPeriod每次轮询间隔 1ms实际由硬件决定此处为最小值Sleep(2000)防抖延时防止同一张卡在 2 秒内被重复记录fflush(log_file)确保日志实时落盘断电时不会丢失最后几条记录。5.3 编译与部署制作免安装绿色版将生成的nfc-logger.exe与libusb-1.0.dll包内bin\目录下复制到同一文件夹不需libnfc.dll因我们链接的是静态库libnfc.lib将Zadig_2.2.exe与nfc-logger.exe放在同一目录双击Zadig切换驱动后即可双击nfc-logger.exe运行日志文件nfc_log.txt自动生成于同目录格式为[Wed Jun 12 14:23:45 2024] UID: 04F2E3B12A3C80 [Wed Jun 12 14:24:12 2024] UID: 04A1C2D3E4F567提示若需记录更多字段如 ATS、ATR可在nfc_initiator_poll_target()后调用nfc_target_init()获取完整响应缓冲区nt.nti.nai.abtAts即为 ATS 数据。6. 进阶技巧用 nfc-poll.exe 的原始输出反推通信时序与协议缺陷6.1 解析 nfc-poll.exe 的十六进制输出流运行nfc-poll.exe -v详细模式会输出类似NFC reader: ACS ACR122U opened. NFC device will poll during 30000 ms (30 s) ISO/IEC 14443A (106 kbps) target: ATQA (SENS_RES): 00 04 UID (NFCID1): 04 f2 e3 b1 2a 3c 80 SAK (SEL_RES): 08 ATS: 78 77 81 02 80 31 80 66 b1 84 04 01 00 00 00 00其中ATS字段是关键78 77TLV 头T0x78TA(1) 存在L0x77长度 117 字节81 02TA(1)值0x02表示最大帧大小为 256 字节80 31TB(1)值0x31表示支持 CID逻辑通道标识符且 FSDI4帧大小指数80 66TC(1)值0x66表示支持 NAD节点地址和 CID。若某张卡的ATS中TB(1)为0x00则表明其最大帧长仅 16 字节此时若向其发送超过 16 字节的命令如ReadBinary读 32 字节必然超时——这正是某些老旧 MIFARE Ultralight 卡的典型限制。6.2 用 Wireshark USBPcap 抓取真实 USB 包验证安装USBPcap包内已提供USBPcapSetup-1.2.0.0.exe启动 Wireshark选择USBPcap1接口运行nfc-poll.exeWireshark 会捕获URB_CONTROL类型包过滤usb.bRequest 0x01GET_DESCRIPTOR查看设备返回的bcdUSB字段若为0x0200USB 2.0则libusb枚举正常若为0x0110USB 1.1则libnfc1.7_VS2010中的pn53x_usb.c第 192 行usbi_dbg(Found PN532 on USB bus %d, device %d, busnum, devaddr);将不会触发因代码中if (bcdUSB 0x0200)判断失败。6.3 修改源码实现“自动重连”机制libnfc1.7_VS2010默认在设备拔出后nfc_open()永远失败。在nfc-open.c中插入重连逻辑// 在 nfc_open() 函数末尾添加 if (pnd NULL) { // 设备不可用时等待 2 秒后重试 Sleep(2000); return nfc_open(context, connstring); // 递归重试 }此修改使nfc-poll.exe在 NFC 设备热插拔后自动恢复无需重启程序——这是某跨平台门禁系统 Demo 的关键补丁。从那以后我每次调试 NFC 设备都强制先用nfc-list.exe确认设备在线再用USBView.exe核对端点号最后才跑nfc-poll.exe -v看 ATS。三步缺一不可少一步就可能把协议问题误判成硬件故障。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

STM32双机SPI通信实战:从单机例程到稳定链路

STM32双机SPI通信实战:从单机例程到稳定链路

简介:这是一份面向嵌入式初学者与STM32开发者的SPI双板通信例程,聚焦两块STM32板子之间通过SPI协议完成主从数据交互的完整实现,并附带液晶显示相关代码,帮助读者理解同步串行通信在实际项目中的落地方式。资源包共60个文件&#…

2026/10/14 18:05:32 阅读更多 →
基于PHP和MySQL的失物招领系统:从环境搭建到二次开发指南

基于PHP和MySQL的失物招领系统:从环境搭建到二次开发指南

简介:一套基于PHP和MySQL的失物招领系统源码,面向计算机专业学生、初级Web开发者以及课程设计/毕业设计人员,用于学习动态网站开发并快速搭建可用的失物招领平台。资源共120个文件,压缩包大小4.56MB,涵盖27个PHP核心逻…

2026/10/14 18:05:32 阅读更多 →
STM32双板SPI主从通信实战:从接线到数据不丢的完整指南

STM32双板SPI主从通信实战:从接线到数据不丢的完整指南

简介:这是一份面向嵌入式初学者与STM32开发者的SPI双机通信例程,聚焦两块STM32板子之间通过SPI协议完成主从数据交互的完整实现,并附带液晶显示相关代码,帮助读者理解同步串行通信在实际项目中的落地方式。资源包共60个文件&#…

2026/10/14 18:05:32 阅读更多 →

最新新闻

仓颉社区 IDE Team 双周例会机制与议题决策实践:基于 2026-04-21 例会的治理复盘

仓颉社区 IDE Team 双周例会机制与议题决策实践:基于 2026-04-21 例会的治理复盘

文档开源治理研发协作 【免费下载链接】community 包含Cangjie社区治理、开发者贡献指南、开发者贡献协议、社区交流等内容 项目地址: https://gitcode.com/Cangjie/community 点击查看 免费下载 本文以仓颉(Cangjie)社区 IDE Team 第二次例…

2026/10/14 20:22:41 阅读更多 →
Vortex 代码风格规范(CODESTYLE.md)实战指南:从童子军规则到 TypeScript 工程化落地

Vortex 代码风格规范(CODESTYLE.md)实战指南:从童子军规则到 TypeScript 工程化落地

桌面应用 【免费下载链接】Vortex Vortex Development 项目地址: https://gitcode.com/gh_mirrors/vor/Vortex 点击查看 免费下载 Vortex 是 Nexus Mods 出品的开源游戏模组管理工具,其代码库横跨 Electron 主进程、React 渲染进程、共享工具库与数十个…

2026/10/14 20:22:41 阅读更多 →
进销存ERP源码+小程序二次开发实战:库存扣减、单据流与避坑指南

进销存ERP源码+小程序二次开发实战:库存扣减、单据流与避坑指南

简介:这是一套面向中小企业与开发者的完整进销存ERP管理系统源码,采用VS2012 .NET与MsSQL技术栈,标准版功能简洁实用,已有多家企业稳定运行,适合需要快速搭建电商、销售、采购、生产等业务模块的团队参考或二次开发。压…

2026/10/14 20:22:41 阅读更多 →
C#科学计算器核心:递归下降解析器与表达式求值实践

C#科学计算器核心:递归下降解析器与表达式求值实践

简介:C#科学型计算器完整开发资料,面向正在学习WinForms/WPF桌面编程的高校学生,及需要完成课程设计或巩固C#事件驱动开发的读者。项目覆盖四则运算、对数、正弦余弦、百分比和二进制/八进制/十六进制转换,以“界面控件布局—按钮…

2026/10/14 20:22:41 阅读更多 →
OCLP-Mod 后台守护进程机制全解析:自动根补丁监控、更新预缓存与 KDK 管理

OCLP-Mod 后台守护进程机制全解析:自动根补丁监控、更新预缓存与 KDK 管理

桌面应用CLI系统编程 【免费下载链接】OCLP-Mod A mod version for OCLP,with more interesting features. 项目地址: https://gitcode.com/gh_mirrors/oc/OCLP-Mod 点击查看 免费下载 OCLP-Mod 通过一组常驻后台的 launchd 服务(LaunchAgent / LaunchD…

2026/10/14 20:22:41 阅读更多 →
权威测评!2026年最火AI论文工具榜单,免费款也能高效产初稿

权威测评!2026年最火AI论文工具榜单,免费款也能高效产初稿

一、实测方法论:5 大维度量化评估 本次实测覆盖全学科论文场景,重点考察以下维度,结果客观可复现: 表格 评估维度权重测评标准中文适配度25%是否符合 GB/T7714 引用规范,语言逻辑自然度,术语准确性免费功能…

2026/10/14 20:21:39 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →