简介本资源提供在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这两个地方一旦搞错后面全是无用功。希望帮到你。本文还有配套的精品资源点击获取