VS2017下编译64位libssh2:CMake配置与OpenSSL集成指南
简介本资源提供在Visual Studio 2017环境下编译生成的64位libssh2库面向需要在Windows平台进行SSH2协议开发、远程文件传输或shell访问的C/C开发者。libssh2作为开源SSH2协议实现其64位版本可确保与64位应用程序的兼容性适合中高级开发者直接集成到项目中。压缩包共115个文件包含109个h头文件、3个lib静态库、2个dll动态库及1个cpp示例文件整体约2.14MB头文件覆盖libssh2与OpenSSL相关接口库文件可直接用于链接。已有1513人学习下载。通过该资源读者可跳过源码获取、依赖配置与CMake编译等繁琐环节直接获得可用的64位库文件与头文件并参考示例快速完成项目属性配置与链接器设置有效降低Windows下SSH功能开发的环境搭建成本。1. 为什么要在 VS2017 下手动编译 64 位 libssh2如果你在 Windows 上做 C/C 开发尤其是涉及 SSH 连接、SFTP 上传下载、远程命令执行这类需求大概率绕不开 libssh2 这个库。它轻量、纯 C、依赖少在 Linux 上一条apt install libssh2-1-dev就完事但到了 Windows Visual Studio 2017 这套组合里事情就没那么顺了。官方不提供 VS2017 的预编译二进制网上能找到的多数是 MinGW 或者老版本 VS 编译出来的 32 位库直接拿来链接 64 位工程要么报 LNK1112 模块计算机类型冲突要么运行时莫名其妙崩溃。我这次接到的需求是在一个已有的 VS2017 x64 工程里集成 SFTP 客户端功能工程本身已经依赖 OpenSSL 1.1.x 的 64 位版本所以 libssh2 也必须走 64 位 同版本 OpenSSL 的路线。踩了两天坑之后我把整个编译流程整理成可复现的步骤包括 CMake 配置、OpenSSL 路径绑定、静态库/动态库选择、以及几个容易翻车的参数。这篇笔记面向的是需要在 Windows 平台落地 libssh2 的开发者新手可以照着一步步走熟手可以直接跳到参数配置和避坑部分看边界条件。2. 编译前的环境准备与依赖选型2.1 VS2017 与 CMake 的版本匹配VS2017 的版本号是 15.x对应的 MSVC 工具集是 v141。这里第一个容易翻车的点就是 CMake 版本。libssh2 从 1.9.0 开始对 CMake 的最低要求是 3.1但如果你用的是 VS2017 自带的 CMake在Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin下版本通常是 3.12 左右够用但不够稳。我一般会单独装一个 CMake 3.20 以上的版本安装时勾选“Add CMake to the system PATH”这样在命令行里直接敲cmake就能调用不用去 VS 的开发者命令提示符里折腾路径。VS2017 本身需要确保安装了“使用 C 的桌面开发”工作负载并且勾选了“适用于 Windows 的 C CMake 工具”和“Windows 10 SDK”。如果你只装了 C 核心功能后面 CMake 生成工程时会报找不到rc.exe或者mt.exe这两个是资源编译器和清单工具libssh2 的 CMake 脚本里会用到。提示VS2017 的社区版、专业版、企业版在编译 libssh2 这件事上没有功能差异不用纠结版本。热词里出现的“vs2017产品密匙”“vs2017密钥”跟编译本身无关这里不展开。2.2 OpenSSL 64 位库的准备libssh2 本身不实现加密算法它依赖后端的加密库最常用的就是 OpenSSL。在 Windows 上编译 64 位 libssh2你必须先有一个 64 位的 OpenSSL 开发包包含头文件、导入库.lib和动态库.dll。常见的做法是用 vcpkg 安装命令是vcpkg install openssl:x64-windows装完之后 vcpkg 会把头文件放在installed\x64-windows\include库文件放在installed\x64-windows\lib动态库在installed\x64-windows\bin。如果你不想用 vcpkg也可以自己从 OpenSSL 官网下载源码编译但那个流程更长这里不展开。我一般会记录下 OpenSSL 的安装根目录比如D:\vcpkg\installed\x64-windows后面 CMake 配置时要显式指定这个路径。注意不要用 32 位的 OpenSSL 库去配 64 位的 libssh2链接阶段会直接报 LNK1112这个错误信息很明确但新手容易忽略。2.3 libssh2 源码获取与目录结构libssh2 的源码可以从官网或 GitHub 仓库获取我这次用的是 1.10.0 版本。下载后解压到一个没有中文和空格的路径下比如D:\dev\libssh2-1.10.0。目录结构里关键的是src核心源码、include对外头文件、cmakeCMake 模块和根目录的CMakeLists.txt。在开始编译之前建议先看一眼CMakeLists.txt里关于CRYPTO_BACKEND的选项。libssh2 支持 OpenSSL、mbedTLS、WinCNG 等多种后端Windows 上如果你不想额外装 OpenSSL可以用 WinCNGWindows 自带的加密 API但 WinCNG 不支持某些算法SFTP 场景下一般还是选 OpenSSL 更稳妥。3. 用 CMake 生成 VS2017 64 位工程并编译3.1 CMake 命令行配置参数详解打开命令行进入 libssh2 源码目录创建一个独立的构建目录比如build-vs2017-x64然后执行 CMake 配置命令。我常用的命令如下mkdir build-vs2017-x64 cd build-vs2017-x64 cmake -G Visual Studio 15 2017 Win64 ^ -DCMAKE_BUILD_TYPERelease ^ -DCRYPTO_BACKENDOpenSSL ^ -DOPENSSL_ROOT_DIRD:/vcpkg/installed/x64-windows ^ -DOPENSSL_INCLUDE_DIRD:/vcpkg/installed/x64-windows/include ^ -DOPENSSL_CRYPTO_LIBRARYD:/vcpkg/installed/x64-windows/lib/libcrypto.lib ^ -DOPENSSL_SSL_LIBRARYD:/vcpkg/installed/x64-windows/lib/libssl.lib ^ -DBUILD_SHARED_LIBSOFF ^ -DBUILD_EXAMPLESOFF ^ -DBUILD_TESTINGOFF ^ ..这段命令里几个关键参数需要说明-G Visual Studio 15 2017 Win64指定生成器为 VS2017 的 64 位工程。注意Win64后缀不能少否则生成的是 32 位工程。-DCMAKE_BUILD_TYPERelease虽然 VS 是多配置生成器这个变量在配置阶段不生效但有些 CMake 脚本会读取它写上没坏处。-DCRYPTO_BACKENDOpenSSL强制使用 OpenSSL 作为加密后端。-DOPENSSL_ROOT_DIR和后面几个OPENSSL_*变量显式告诉 CMake 去哪里找 OpenSSL 的头文件和库。如果只写OPENSSL_ROOT_DIRCMake 的 FindOpenSSL 模块有时会找到系统里其他版本的 OpenSSL导致链接错误。-DBUILD_SHARED_LIBSOFF生成静态库。如果你需要动态库改成ON但动态库在 Windows 上需要额外处理导出符号后面会讲。-DBUILD_EXAMPLESOFF和-DBUILD_TESTINGOFF跳过示例和测试加快编译速度。配置成功后你会看到build-vs2017-x64目录下生成了libssh2.sln文件。3.2 编译静态库与动态库的差异静态库和动态库在 CMake 配置上的区别就是BUILD_SHARED_LIBS这个变量。静态库生成的是libssh2.lib注意不是libssh2_static.liblibssh2 的 CMake 脚本里对静态库的命名就是libssh2.lib动态库生成的是libssh2.lib导入库和libssh2.dll。这里有一个血泪经验如果你同时需要静态库和动态库不要在一个构建目录里反复切换BUILD_SHARED_LIBS重新配置因为 CMake 的缓存会残留旧配置导致生成的库文件混乱。正确做法是建两个独立的构建目录比如build-static和build-shared分别配置和编译。编译命令可以用 CMake 的--build参数cmake --build . --config Release --target libssh2这条命令会在build-vs2017-x64\src\Release下生成libssh2.lib。如果你用 VS 打开libssh2.sln手动编译记得在解决方案配置里选 Release 和 x64不要选 Debug 或 Win32。3.3 验证生成的库是否为 64 位编译完成后怎么确认生成的libssh2.lib是 64 位而不是 32 位我一般用dumpbin工具它是 VS 自带的。打开“VS2017 开发者命令提示符”执行dumpbin /headers libssh2.lib | findstr machine如果输出里包含x64说明是 64 位库。如果显示x86那就是 32 位需要检查 CMake 生成器是否写对了Win64。另一个方法是看库文件的文件大小64 位库通常比 32 位大一些但这个不可靠还是dumpbin最准。注意dumpbin需要在 VS 开发者命令提示符里运行普通 cmd 里可能找不到这个命令。如果你在普通 cmd 里敲dumpbin报“不是内部或外部命令”不是库的问题是环境变量没配。4. 把 libssh2 集成到 VS2017 工程头文件、库路径与运行时依赖4.1 工程属性里的包含目录与库目录配置编译出libssh2.lib之后下一步是把它集成到你的 VS2017 工程里。右键工程 - 属性确保平台选的是 x64然后配置以下几个地方C/C - 常规 - 附加包含目录添加 libssh2 的include目录比如D:\dev\libssh2-1.10.0\include。注意这个目录下应该能看到libssh2.h文件。链接器 - 常规 - 附加库目录添加libssh2.lib所在的目录比如D:\dev\libssh2-1.10.0\build-vs2017-x64\src\Release。链接器 - 输入 - 附加依赖项添加libssh2.lib、libcrypto.lib、libssl.lib、ws2_32.lib、crypt32.lib。后面两个是 Windows 的网络和加密 API 库libssh2 在 Windows 上会用到。如果你用的是动态库版本的 libssh2还需要把libssh2.dll和 OpenSSL 的libcrypto-1_1-x64.dll、libssl-1_1-x64.dll复制到你的 exe 输出目录否则运行时会报“找不到 libssh2.dll”。4.2 静态链接时的预处理器宏静态链接 libssh2 时有一个容易忽略的宏LIBSSH2_STATIC。你需要在工程的 C/C - 预处理器 - 预处理器定义里加上这个宏。如果不加libssh2 的头文件会按照动态库的方式声明函数带__declspec(dllimport)链接静态库时会报 LNK2019 无法解析的外部符号。另外如果你用的是 OpenSSL 1.1.x 的静态库可能还需要定义OPENSSL_STATIC但 vcpkg 默认装的是动态库版本的 OpenSSL所以这个宏一般不用加。具体看你用的 OpenSSL 包类型。4.3 一个最小可运行的 SSH 连接测试集成完成后写一个最小的测试代码验证 libssh2 是否能正常工作。下面这段代码初始化 libssh2、连接本机 SSH 服务假设你开了 OpenSSH Server、执行一次握手#include libssh2.h #include winsock2.h #include stdio.h #pragma comment(lib, ws2_32.lib) #pragma comment(lib, libssh2.lib) int main() { WSADATA wsaData; WSAStartup(MAKEWORD(2, 2), wsaData); libssh2_init(0); SOCKET sock socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in sin; sin.sin_family AF_INET; sin.sin_port htons(22); sin.sin_addr.s_addr inet_addr(127.0.0.1); if (connect(sock, (struct sockaddr*)sin, sizeof(sin)) ! 0) { printf(connect failed\n); return 1; } LIBSSH2_SESSION* session libssh2_session_init(); if (libssh2_session_handshake(session, sock) ! 0) { printf(handshake failed\n); return 1; } printf(handshake ok\n); libssh2_session_free(session); closesocket(sock); libssh2_exit(); WSACleanup(); return 0; }这段代码的逻辑是先初始化 Winsock再初始化 libssh2然后建立 TCP 连接最后调用libssh2_session_handshake完成 SSH 协议握手。如果输出handshake ok说明库集成成功。如果握手失败常见原因是本机没有 SSH 服务或者防火墙拦截了 22 端口。参数说明libssh2_init(0)的参数是标志位传 0 即可libssh2_session_handshake的第二个参数是 socket 句柄在 Windows 上就是SOCKET类型直接传进去就行。5. 避坑与常见问题排查5.1 链接报 LNK1112 模块计算机类型冲突现象链接阶段报LNK1112: 模块计算机类型“x86”与目标计算机类型“x64”冲突。原因你链接的某个库是 32 位的最常见的是 OpenSSL 库或者 libssh2 库本身是 32 位。CMake 生成时如果没写Win64生成的 libssh2 就是 32 位。解决用dumpbin /headers检查每个 .lib 文件的机器类型确保全是 x64。重新用-G Visual Studio 15 2017 Win64生成 libssh2 工程。5.2 运行时报找不到 libssh2.dll现象exe 双击运行报“找不到 libssh2.dll”但编译链接都通过了。原因你用的是动态库版本的 libssh2但 dll 不在 exe 的搜索路径里。解决把libssh2.dll和 OpenSSL 的两个 dll 复制到 exe 同目录或者把 dll 所在目录加到系统 PATH 里。我一般直接在工程里配一个生成后事件自动复制 dll。5.3 握手失败返回 -1 但无具体错误现象libssh2_session_handshake返回 -1但不知道具体原因。原因libssh2 的错误信息需要主动获取默认不打印。解决在握手失败后调用libssh2_session_last_error获取错误码和错误描述。常见错误码有LIBSSH2_ERROR_SOCKET_RECV网络问题和LIBSSH2_ERROR_KEX_FAILURE密钥交换失败通常是加密算法不匹配。5.4 CMake 配置时找不到 OpenSSL现象CMake 配置阶段报Could NOT find OpenSSL。原因OPENSSL_ROOT_DIR路径写错或者路径里有反斜杠没转义。解决CMake 里路径用正斜杠/或者双反斜杠\\。检查OPENSSL_ROOT_DIR下是否有include/openssl/ssl.h和lib/libssl.lib。5.5 静态库链接后运行崩溃在 libssh2_init现象程序启动时调用libssh2_init直接崩溃。原因静态链接时 OpenSSL 的初始化顺序有问题或者 OpenSSL 库本身也是静态链接但缺少依赖。解决确保 OpenSSL 库和 libssh2 库的链接顺序正确一般把libssh2.lib放在libcrypto.lib和libssl.lib前面。如果还不行改用动态库版本的 OpenSSL。6. 进阶用 CMake 脚本一键完成 64 位编译与集成手动敲 CMake 命令容易漏参数我后来写了一个build_libssh2.bat脚本放在 libssh2 源码根目录双击就能完成配置和编译。脚本内容如下echo off set OPENSSL_ROOTD:\vcpkg\installed\x64-windows set BUILD_DIRbuild-vs2017-x64 if not exist %BUILD_DIR% mkdir %BUILD_DIR% cd %BUILD_DIR% cmake -G Visual Studio 15 2017 Win64 ^ -DCMAKE_BUILD_TYPERelease ^ -DCRYPTO_BACKENDOpenSSL ^ -DOPENSSL_ROOT_DIR%OPENSSL_ROOT% ^ -DOPENSSL_INCLUDE_DIR%OPENSSL_ROOT%\include ^ -DOPENSSL_CRYPTO_LIBRARY%OPENSSL_ROOT%\lib\libcrypto.lib ^ -DOPENSSL_SSL_LIBRARY%OPENSSL_ROOT%\lib\libssl.lib ^ -DBUILD_SHARED_LIBSOFF ^ -DBUILD_EXAMPLESOFF ^ -DBUILD_TESTINGOFF ^ .. cmake --build . --config Release --target libssh2 echo. echo Build finished. Check src\Release\libssh2.lib pause这个脚本的好处是把 OpenSSL 路径抽成变量换机器时只改第一行就行。编译完成后脚本会停在pause你可以直接去src\Release目录拿libssh2.lib。验证编译结果是否可用我一般会再写一个小的 CMake 工程用find_package的方式引入 libssh2但 libssh2 官方没有提供 CMake config 文件所以更实际的做法是在你的主工程里直接配包含目录和库目录。如果你想让主工程也能用find_package(libssh2)可以自己写一个libssh2-config.cmake里面设置LIBSSH2_INCLUDE_DIRS和LIBSSH2_LIBRARIES两个变量放到 CMake 的模块搜索路径下。还有一个技巧如果你需要同时维护 32 位和 64 位两个版本的 libssh2可以把编译输出分别放到lib\x86和lib\x64目录然后在 VS 工程里用$(Platform)宏来动态引用库目录比如$(SolutionDir)lib\$(Platform)。这样切换平台时不用改工程属性。从那以后我每次编译 libssh2 之前都会先用dumpbin确认 OpenSSL 库的位数再检查 CMake 生成器有没有带Win64这两个地方一旦搞错后面全是无用功。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Python基础学习之认识线程

Python基础学习之认识线程

前言 在写第一行多线程代码之前,先搞清楚「线程」到底是什么,比记住 Thread 的用法更重要。很多诡异的 bug——数据被莫名覆盖、程序退不出来、日志顺序乱成一团——根源都是对线程模型的理解有偏差,而不是语法不会写。 常见的误解有两个。一…

2026/10/13 3:31:51 阅读更多 →
5G信令流程解析:从NAS/NGAP到PDU会话的排错实战指南

5G信令流程解析:从NAS/NGAP到PDU会话的排错实战指南

简介:《5G信令流程解析》是一份面向通信工程、网络运维及5G技术学习者的精简PDF文档,系统梳理5G网络从接入到数据传输的完整信令链路。资源仅1个PDF文件,压缩包大小105KB,便于快速查阅与移动学习。文档从信令流程概述入手&#xf…

2026/10/13 3:31:51 阅读更多 →
海明码编码与纠错原理详解:从校验位布局到SEC-DED工程实现

海明码编码与纠错原理详解:从校验位布局到SEC-DED工程实现

简介:海明码编码C实现资源包,面向计算机专业学生、通信工程学习者及需要了解纠错编码的开发者,帮助理解海明码在单比特错误检测与纠正中的原理,并掌握其代码实现方式。压缩包共28个文件,涵盖cpp源文件、h头文件、Visua…

2026/10/13 3:31:51 阅读更多 →

最新新闻

关系模型实战指南:从二维表到业务稳定性的底层逻辑

关系模型实战指南:从二维表到业务稳定性的底层逻辑

1. 这不是教科书里的“关系”,而是你每天都在用的数据组织逻辑“关系模型的基本概念”——看到这八个字,很多人第一反应是大学数据库课上那个被粉笔灰笼罩的下午,黑板上写着“实体、属性、域、键”,讲台下有人偷偷刷手机&#xff…

2026/10/13 12:22:17 阅读更多 →
Qt国际化翻译完整实践:从tr()到动态语言切换

Qt国际化翻译完整实践:从tr()到动态语言切换

做Qt开发这么多年,遇到最多的问题不是功能写不出来,而是功能做完以后客户说看不懂。于是QT国际化翻译就成了绕不开的环节。表面上看,这事只是把界面文字换成英文、日文,真正做起来却涉及源码扫描、翻译文件管理、运行时加载、动态…

2026/10/13 12:22:17 阅读更多 →
华为+红帽双赛道:2026网工转型的破局之道

华为+红帽双赛道:2026网工转型的破局之道

1. 为什么2026年网工转型,我建议你押注"华为红帽"双赛道最近不少朋友私信问我关于2026年转行网络工程师(网工)的事,大家的焦虑点很一致:AI工具越来越强,初中级网工的活是不是要被替代&#xff1f…

2026/10/13 12:22:17 阅读更多 →
Modern.js 服务端编译核心 @modern-js/server-utils:TypeScript 编译、别名解析与原生 ESM 支持的源码级解析

Modern.js 服务端编译核心 @modern-js/server-utils:TypeScript 编译、别名解析与原生 ESM 支持的源码级解析

前端后端Web框架 【免费下载链接】modern.js A progressive web framework based on React and Rsbuild. 项目地址: https://gitcode.com/gh_mirrors/mo/modern.js 点击查看 免费下载 本文围绕 packages/server/utils/CHANGELOG.md 记录的能力演进,结合…

2026/10/13 12:22:17 阅读更多 →
基于SpringBoot+Vue的派出所健康档案管理系统设计与实现

基于SpringBoot+Vue的派出所健康档案管理系统设计与实现

选题背景 社会对公共安全的重视,派出所民警的工作压力日益增大,其健康状况备受关注。早期的健康档案管理方式效率低下,难以实现信息的实时共享和动态更新。本系统采用 Spring Boot 框架,结合前端技术和数据库技术,构建…

2026/10/13 12:22:17 阅读更多 →
EmbeddingGemma 2本地多模态嵌入模型部署与向量检索实战

EmbeddingGemma 2本地多模态嵌入模型部署与向量检索实战

1. 这个模型到底是什么:先把它的定位弄清楚拿到"EmbeddingGemma 2"这个名字,第一反应就是:这是个嵌入模型,740M参数规模,多模态,而且主打本地推理。这几个关键词放在一起,意味着它并不…

2026/10/13 12:21:16 阅读更多 →

日新闻

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

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

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

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/13 2:54:56 阅读更多 →
影刀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 阅读更多 →