windows vs2005编译libssh2支持sftp

news2024/9/24 13:14:39

windows vs2005编译libssh2支持sftp

1、编译模块

​ 需要用到4个库:libcurl、libssh2、openssl、zlib

为啥要用libssh2

因为libcurl实现sftp功能依赖libssh2,是对libssh2的封装。
所以也可以直接用libssh2实现sftp。

为啥要用openssl

因为libssh2依赖openssl和zlib

环境:win10,vs2005,curl-7.62.0,libssh2-1.8.0,openssl-1.0.2q,zlib-1.2.11

2、下载源码

下载zlib

链接:https://zlib.net/fossils/

选择zlib-1.2.1.1

下载libcurl

链接: https://curl.haxx.se/download/
我这里选择的版本是curl-7.62.0,

下载libssh2

链接: https://www.libssh2.org/download/
我这里选择的版本是libssh2-1.8.0

下载openssl

链接: https://www.openssl.org/source/old/0.9.x/
我这里选择的版本是openssl-1.0.2q

在这里插入图片描述

perl工具

百度网盘链接:https://pan.baidu.com/s/107UTzX-9_vgFPTW93Ec3AA

在这里插入图片描述

下载完成后双击安装,安装过程中会自动配置环境变量。

在这里插入图片描述

检查perl是否安装成功

在这里插入图片描述

安装完成。

NASM工具

下载链接:https://www.nasm.us/pub/nasm/releasebuilds/2.16.01/win64/

在这里插入图片描述

选择*.zip格式下载,然后解压到windwos目录,并配置环境变量。

在这里插入图片描述


3、准备目录

在这里插入图片描述

在源码根目录创建deps目录,里面包含include、lib、bin

C:\Users\0049003505\Desktop\sftp-dll\

                                    |_curl-7.62.0

                                    | |_winbuild

                                    |

                                    |_deps

                                      |_ lib

                                      |_ include

                                      |_ bin

4、编译zlib

(1)打开vs2005命令行窗口

(2)进入zlib-1.2.1.1\根目录 –cd C:\Users\0049003505\Desktop\sftp3\zlib-1.2.1.1

(3)执行

nmake -f win32/Makefile.msc

(4)deps\bin存放zlib1.dll

deps\include存放zconf.h,zlib.h

deps\lib存放zdll.lib(动态库导入),zlib.lib (静态库)

5、编译openssl

(1)进入openssl-1.0.2q\根目录,执行perl Configure VC-WIN32 --prefix=openssl-dll

(2)执行ms\do_nasm

(3)执行nmake -f ms\ntdll.mak 编译结果在out32dll文件夹内,如果编译静态库执行nmake -f ms\nt.mak

在这里插入图片描述

​ 出现上述内容编译成功!

(4)执行nmake -f ms\ntdll.mak test 检查结果,提示passed为正常,如果编译静态库执行nmake -f ms\nt.mak test

在这里插入图片描述

检查通过~

(5)执行nmake -f ms\ntdll.mak install 将结果out32dll内容复制到步骤2中的目录内并安装,如果编译静态库执行nmake -f ms\nt.mak install

步骤2中openssl-dll为目录DLL目录,用于LIBCURL编译

(6) 将openssl-dll文件夹内的incllude bin lib复制到deps中

6、编译libssh2

(1)进入libssh2-1.8.0\win32,修改config.mk,修改zlib目录及openssl目录为前述编译结果目录

(2)编译

  • 第一种编译方法:进入libssh2-1.8.0\根目录,执行nmake -f NMakefile,此编译生成DLL,无libssh2.lib

  • 第二种编译方法:用VS打开libssh2-1.8.0\win32\libssh2.dsp,将zlib,openssl编译结果include及lib目录加入当前项目C++环境内

    当前版本选择第二种

(3)复制文件

deps\bin存放libssh2.dll

deps\include存放libssh2.h,libssh2_publickey.h,libssh2_sftp.h

deps\lib存放libssh2.lib

7、编译libcurl

(1)准备上述编译产物

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

(1)进入curl-7.62.0\winbuild目录

nmake /f Makefile.vc mode=dll VC=8 SSL_PATH=C:\Users\0049003505\Desktop\sftp-dll\deps ZLIB_PATH=C:\Users\0049003505\Desktop\sftp-dll\deps SSH2_PATH=C:\Users\0049003505\Desktop\sftp-dll\deps ENABLE_IDN=no DEBUG=no WITH_SSL=dll WITH_ZLIB=dll WITH_SSH2=dll

将上述路径修改为自己的路径,然后执行编译。

在这里插入图片描述

编译ok;

(3)复制文件

在这里插入图片描述

如果是以动态库的形式编译,编译后生成的include bin lib 都在 libcurl-vc8-x86-release-dll-ssl-dll-zlib-dll-ssh2-dll-ipv6-sspi 目录

在这里插入图片描述

将当前文件夹的内容复制到deps下的include lib bin中

8、创建工程进行测试

(1)在vs2005中创建一个win32的工程

(2)将下列代码复制到main函数中,代码来源也是从libcurl库中复制的ftpget.c示例

(3)修改工程文件所以来的头文件和库文件的路径,依赖库为libcurl.lib

在这里插入图片描述


在这里插入图片描述

(3)编译运行,就可以发现通过sftp成功下载文件

如果当前测试程序是release编译,注意要将libcurl.dll libeay32.dll libssh2.dll ssleay32.dll zlib1.dll 库文件放在release目录下,否则程序因为缺少动态库文件而无法正常启动

// sftp_test.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
 * furnished to do so, under the terms of the COPYING file.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ***************************************************************************/
/* <DESC>
 * Gets a file using an SFTP URL.
 * </DESC>
 */

#include <stdio.h>

#include <curl/curl.h>

/* define this to switch off the use of ssh-agent in this program */
#undef DISABLE_SSH_AGENT

/*
 * This is an example showing how to get a single file from an SFTP server.
 * It delays the actual destination file creation until the first write
 * callback so that it won't create an empty file in case the remote file
 * doesn't exist or something else fails.
 */

struct FtpFile {
  const char *filename;
  FILE *stream;
};

static size_t my_fwrite(void *buffer, size_t size, size_t nmemb,
                        void *stream)
{
  struct FtpFile *out = (struct FtpFile *)stream;
  if(out && !out->stream) {
    /* open file for writing */
    out->stream = fopen(out->filename, "wb");
    if(!out->stream)
      return -1; /* failure, can't open file to write */
  }
  return fwrite(buffer, size, nmemb, out->stream);
}


int main(void)
{
  CURL *curl;
  CURLcode res;
  struct FtpFile ftpfile = {
    "C:\\Users\\0049003505\\Desktop\\sftp_test\\ai.xml", /* name to store the file as if successful */
    NULL
  };

  curl_global_init(CURL_GLOBAL_DEFAULT);

  curl = curl_easy_init();
  if(curl) {
    /*
     * You better replace the URL with one that works!
     */
    curl_easy_setopt(curl, CURLOPT_URL,
		"sftp://10.72.55.169:22/v2para/config/ai.xml");
	//curl_easy_setopt(curl, CURLOPT_USERPWD, "lanyx:10");
    /* Define our callback to get called when there's data to be written */
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite);

	curl_easy_setopt(curl, CURLOPT_USERNAME, "root");
	curl_easy_setopt(curl, CURLOPT_PASSWORD, "Zxm10*netviewu");

    /* Set a pointer to our struct to pass to the callback */
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ftpfile);

#ifndef DISABLE_SSH_AGENT
    /* We activate ssh agent. For this to work you need
       to have ssh-agent running (type set | grep SSH_AGENT to check) or
       pageant on Windows (there is an icon in systray if so) */
    //curl_easy_setopt(curl, CURLOPT_SSH_AUTH_TYPES, CURLSSH_AUTH_AGENT);
	curl_easy_setopt(curl, CURLOPT_SSH_AUTH_TYPES, CURLSSH_AUTH_PASSWORD);  
      //这里一定要选择CURLSSH_AUTH_PASSWORD 默认的CURLSSH_AUTH_AGENT会验证失败~
	
#endif

    /* Switch on full protocol/debug output */
    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);

    res = curl_easy_perform(curl);

    /* always cleanup */
    curl_easy_cleanup(curl);

    if(CURLE_OK != res) {
      /* we failed */
      fprintf(stderr, "curl told us %d\n", res);
    }
  }

  if(ftpfile.stream)
    fclose(ftpfile.stream); /* close the local file */

  curl_global_cleanup();

  system("pause");
  return 0;
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1408982.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【linux】查看进程和子进程

在Linux系统中&#xff0c;可以使用多个命令来查看进程及其子进程。以下是一些常用的方法&#xff1a; 1. ps 命令 ps 命令用于显示当前进程的状态。可以结合不同的选项来查看进程及其子进程。 查看进程树&#xff1a; ps -auxf - -a 显示所有进程。 - -u 显示进程的用户/所…

AI伦理边界:探索人工智能伦理计算

大家好&#xff0c;近年学界与工业界都已开始关注并热议 AI 伦理治理问题&#xff0c;也在伦理规范研究上取得了初步进展。然而&#xff0c;由于 AI 伦理的抽象性&#xff0c;如何定量化度量智能系统的伦理&#xff0c;还是一个未知的难题。 李学龙教授团队在《中国科学&#…

【学网攻】 第(5)节 -- Cisco VTP的使用

文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认识及使用【学网攻】 第(3)节 -- 交换机配置聚合端口【学网攻】 第(4)节 -- 交换机划分Vlan 前言 网络已经成为了我们生活中不可或缺的一部分&#xff0c;它连接了世界各地的人们&#xff0c;让信息和资…

apple watch开通esim(一号双终端)报错解决方法

写在前面&#xff1a; 本文不一定可以解决您问题&#xff0c;本文记录了作者在遇到该情况时的处理办法&#xff0c;导致这个问题的原因会有很多&#xff0c;本文仅记录部分&#xff0c;仅供读者参考。与客服人员沟通时&#xff0c;请避免说esim&#xff0c;大多数客服人员不一定…

windbg :查看局部变量值

查看变量有以下几种常用方式&#xff1a; 仍以我们上篇 &#xff1a; 《windbg : x 命令》中的代码作为示例来讲解使用。 源码&#xff1a; #include <iostream>using namespace std;struct JKGirl{std::string name;int age;friend ostream& operator <<(o…

【机器学习300问】17、什么是欠拟合和过拟合?怎么解决欠拟合与过拟合?

一个问题出现了&#xff0c;我们首先要描述这个问题&#xff0c;然后分析问题出现的原因&#xff0c;找到原因后提出解决方案。废话不多说&#xff0c;直接上定义&#xff0c;然后通过回归和分类任务的例子来做解释。 一、什么是欠拟合和过拟合&#xff1f; &#xff08;1&am…

面试题:String s = new String(“xyz“) 创建了几个对象?

项目场景&#xff1a; 今天分享一篇基础技术面试题。 这个问题相信每个学习 java 的同学都不陌生&#xff0c;作为一个经典的面试题&#xff0c;到现在工作这么多年了我真是认为挺操蛋的一个问题&#xff0c;在网上到现在你仍然可以看见很多讨论这个问题的人&#xff0c;其中不…

酷开科技 | 酷开系统体育频道燃爆体育赛事,为偶像疯狂打CALL

体育竞技&#xff0c;总会带给我们激情澎湃的感受&#xff0c;兴奋、激动、热血&#xff0c;这些瞬间也许就是竞技体育的魅力&#xff01;酷开科技通过酷开系统的体育频道&#xff0c;为广大体育迷们提供了一个观赛平台。在这个平台上&#xff0c;你可以欣赏到各类体育赛事的精…

用JavaFX写了一个简易的管理系统

文章目录 前言正文一、最终效果1.1 主页面1.2 动物管理页面-初始化1.3 动物管理页面-修改&新增1.4 动物管理页面-删除&批量删除 二、核心代码展示2.1 启动类2.2 数据库配置-db.setting2.3 日志文本域组件2.4 自定义表格视图组件2.5 自定义分页组件2.6 动物管理页面2.7 …

JVM/GC复习1---更新中

JVM/GC JVMGC垃圾回收算法1.引用计数法2.标记清除发3.标记压缩算法4.复制算法5.分代算法 收集器1.串行垃圾收集器2.并行垃圾收集器2.CMS垃圾收集器 3.G1垃圾收集器(重点)jdk1.7开始1.9默认的回收器Young GC模式Mixed GCFull GC JVM 待更新中ing GC 垃圾回收:程序运行的时候必…

2024年美赛数学建模思路 - 案例:异常检测

文章目录 赛题思路一、简介 -- 关于异常检测异常检测监督学习 二、异常检测算法2. 箱线图分析3. 基于距离/密度4. 基于划分思想 建模资料 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 一、简介 – 关于异常…

【JSON2WEB】03 go的模板包html/template的使用

Go text/template 是 Go 语言标准库中的一个模板引擎&#xff0c;用于生成文本输出。它使用类似于 HTML 的模板语言&#xff0c;可以将数据和模板结合起来&#xff0c;生成最终的文本输出。 Go html/template包实现了数据驱动的模板&#xff0c;用于生成可防止代码注入的安全的…

一文掌握Shell

文章目录 Shell概述脚本的常用执行方式Linux中的sh解释器Linux中的/etc 编写sh脚本第一个sh脚本变量1. 系统预定义变量2. 自定义变量3. 变量定义规则单引号和双引号的区别 4. 特殊变量 运算符命令替换条件判断常用判断语句 流程控制if语句case语句while循环 read读取控制台输入…

生产、计划、仓库、质量,一大堆的工厂数据要怎么收集?MES系统替你解决!

随着制造业的发展和进步&#xff0c;工厂运营面临着越来越多的挑战&#xff0c;特别是在数据管理和生产过程控制方面。生产、计划、仓库、质量等方面的数据分散在各个系统和部门中&#xff0c;数据的收集和分析变得复杂而困难。然而&#xff0c;MES系统为工厂提供了一个综合性解…

成功安装DCNv4

最终结果 终于安装成功了。 环境 系统&#xff1a;ubuntu22.04 CUDA&#xff1a;12.1 python&#xff1a;3.11 显卡驱动&#xff1a;545 安装过程 系统、CUDA和python的安装过程忽略&#xff0c;这些都能找到。这里只写不同的地方。 配置CUDAHOME 执行命令“ gedit ~/…

余弦定理是怎么推导的?

余弦定理是怎么推导的? 已知余弦定理(low of cosines)表达如下: A B 2 = B C 2 + A C 2 − 2 B C ∗ A C ∗ cos ⁡ θ AB^2=BC^2+AC^2-2BC*AC*\cos \theta AB2=BC2+AC2−2BC∗AC∗cosθ,其中 A B , B C , A C AB,BC,AC AB,BC,AC和 θ \theta θ的关系如下: 那么这个公式是…

数据库缓存策略

数据库缓存策略 以下是数据库与缓存的五种常见策略。 1缓存旁路 缓存旁路&#xff08;Cache-Aside&#xff09; 在缓存旁路策略中&#xff0c;数据库缓存位于数据库旁边。当应用程序请求数据时&#xff0c;它会首先检查缓存 如果缓存中存在数据&#xff08;缓存命中&#xff…

风速预测 | Python基于CEEMDAN-CNN-Transformer+ARIMA的风速时间序列预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 CEEMDAN-CNN-TransformerARIMA是一种用于风速时间序列预测的模型&#xff0c;结合了不同的技术和算法。收集风速时间序列数据&#xff0c;并确保数据的质量和完整性。这些数据通常包括风速的观测值和时间戳。CEEMDAN分…

SpringCloudAlibaba系列之Nacos实战

目录 注意事项 参考资源 Nacos配置中心 初始化项目 进行Nacos相关配置 运行 Nacos注册中心 dubbo方式 对外暴露接口dubbo-api 服务提供者dubbo-provider 服务消费者dubbo-consumer 负载均衡客户端方法 服务提供者 服务消费者 注意事项 不管是使用Nacos配置中心&…

使用POI生成word文档的table表格

文章目录 使用POI生成word文档的table表格1. 引入maven依赖2. 生成table的两种方式介绍2.1 生成一行一列的table2.2 生成固定行列的table2.3 table合并列2.4 创建多个table存在的问题 使用POI生成word文档的table表格 1. 引入maven依赖 <dependency><groupId>org.…