curl,libssh2,openssl,zlib的编译

2023-11-08

前年,客户要求ATM客户端程序添加sftp功能,领导发给我4个静态库,分别是libcurl.lib,libeay32.lib,ssleay32.lib,libssh2.lib。
使用这4个库成功实现了sftp功能。当时从网络上查到该四个静态库均可以用开源代码编译生成。
前段时间工作不忙,想起了这件事,打算从网上下载源代码,自己动手编译这些源代码生成这4个库。一开始根本不知道如何下手,
找baidu帮忙吧。按照网上的做法开始编译这些源代码,但是编译过程中遇到各种问题,每次遇到问题就baidu解决方法,如果没有找到解决办法就
查看源代码包中的说明文档。这些说明文档全是英文的,这时候就体现出学英语的意义来了。在编译这些像天书一样的源代码的过程中,深深感受到
这些源代码的作者的智慧、毅力和无私的美德,向这些精英致敬!废话说完了,切入正题。
1.openssl的编译(release模式)
1.1下载openssl源代码
baidu一下openssl,很容易就能找到openssl的官网,我下的版本是openssl-0.9.8g
1.2安装ActivePerl
下载ActivePerl并安装,编译openssl时要用到
1.3编译openssl源代码
首先我强烈推荐你阅读一下根目录下的INSTALL.W32文件,该文件详细介绍了如何编译openssl。我总结了一下该文档的要点,在下面列出来。
a.打开命令提示符,进入openssl根目录,执行perl Configure VC-WIN32 --prefix=c:/some/openssl/dir
需要注意的是/不要修改成\,否则可能在编译openssl过程中遇到麻烦。
b.执行ms\do_ms
c.执行C:\Program Files\Microsoft Visual Studio\VC98\Bin\VCVARS32.BAT
d.如果你想得到动态库请执行nmake -f ms\ntdll.mak
如果你想得到静态库请执行nmake -f ms\nt.mak
用上述方法得到的动态库或静态库是release模式的,如果你想得到debug模式请阅读一下根目录下的INSTALL.W32文件。
2.zlib的编译
2.1下载zlib源代码
我下的版本是zlib-1.2.11
2.2编译zlib
a.打开命令提示符,执行C:\Program Files\Microsoft Visual Studio\VC98\Bin\VCVARS32.BAT
b.进入zlib根目录\win32,执行nmake -f win32/Makefile.msc
3.libssh2的编译
3.1下载libssh2源代码
我下的版本是libssh2-0.16
3.2编译libssh2
在libssh2-0.16\win32目录下我看到了熟悉的.dsw文件,这下终于可以不用nmake命令来编译了,双击libssh2.dsw打开它吧,
出乎意料的是它不是一个正常的工作区文件,visual c++ 6.0没有打开有效的工程文件。费了好长时间终于搞明白了,原来
这里的.dsw文件和.dsp文件中的换行符均是linux下的换行符,visual c++ 6.0不能识别这些换行符。原因找到了,问题就好解决了。
我用beyond compare(一款代码对比软件)将libssh2-0.16\win32目录下所有的.dsw和.dsp文件都另存为了windows下的换行符,
visual c++ 6.0可以成功打开工作区文件并成功加载工程文件了。
接下来将openssl根目录\include下的openssl文件夹复制到libssh2根目录\win32目录下,
将编译openssl生成的库文件libeay32.lib和ssleay32.lib复制到libssh2根目录\win32目录下,
将zlib根目录下所有的.h头文件复制到libssh2根目录\win32目录下,
将编译zlib生成的zlib.lib复制到libssh2根目录\win32目录下。
接下来点击visual c++的Build菜单,Rebuild All子菜单,编译过程中会报错error C2065: 'socklen_t' : undeclared identifier,
这就是开源代码的缺点,无法保证代码的完全正确。baidu了一下,找到解决该错误的方法。
在session.c文件中添加socklen_t的定义如下:
#if defined(_MSC_VER) && (_MSC_VER == 1200)
typedef int socklen_t;
#endif

你可以根据自己的需要选择生成静态库还是动态库,debug模式还是release模式。
如果你选择生成静态库,你会在之后的测试中发现一个很诡异,很致命的问题,应用程序无法链接静态库中的函数。
经过很长时间的测试和分析,终于找到了原因。请看头文件libssh2.h中定义宏的一段代码。
/* Allow alternate API prefix from CFLAGS or calling app */
#ifndef LIBSSH2_API
# ifdef LIBSSH2_WIN32
#  ifdef LIBSSH2_LIBRARY
#   define LIBSSH2_API __declspec(dllexport)
#  else
#   define LIBSSH2_API __declspec(dllimport)
#  endif /* LIBSSH2_LIBRARY */
# else /* !LIBSSH2_WIN32 */
#  define LIBSSH2_API
# endif /* LIBSSH2_WIN32 */
#endif /* LIBSSH2_API */
当你选择生成静态库时,宏LIBSSH2_API的值为__declspec(dllexport),事实上这种情况下LIBSSH2_API的值应该为空。
我对这段代码做了最简单的修改如下。
/* Allow alternate API prefix from CFLAGS or calling app */
#ifndef LIBSSH2_API
# ifdef LIBSSH2_WIN32
#  ifdef LIBSSH2_LIBRARY
#   define LIBSSH2_API //__declspec(dllexport)
#  else
#   define LIBSSH2_API //__declspec(dllimport)
#  endif /* LIBSSH2_LIBRARY */
# else /* !LIBSSH2_WIN32 */
#  define LIBSSH2_API
# endif /* LIBSSH2_WIN32 */
#endif /* LIBSSH2_API */
经过测试,问题是解决了,但是修改后的这段代码是无法兼容生成动态库这种情况的,所以如果你想生成动态库,
这段代码是不需要修改的。
Rebuild All就完成了libssh2的编译。
4编译curl
4.1下载curl
我下载的是curl-7.32.0
4.2编译curl
编译之前建议你好好看一下curl根目录\winbuild目录下的BUILD.WINDOWS.txt,我总结出编译curl的主要步骤如下:
a.在curl根目录的上一级目录新建文件夹命名为deps,在deps文件夹下新建三个文件夹,分别命名为include,lib和bin。
将openssl根目录\include下的openssl文件夹复制到include文件夹下,将libssh2根目录\include文件夹下的文件复制到
include文件夹下,将zlib根目录下所有的.h头文件复制到include文件夹下,将openssl根目录\out32目录下的libeay32.lib和ssleay32.lib
复制到lib文件夹。如果nmake时设置WITH_ZLIB=static,请将zlib根目录下的zlib.lib复制到lib文件夹,并将zlib.lib重命名为zlib_a.lib,如果
nmake时设置WITH_ZLIB=dll,我没有测试过这种情况,请自行处理。如果nmake时设置WITH_SSH2=static,请将libssh2根目录\win32\Release_lib
目录下的libssh2.lib复制到lib文件夹,并重命名为libssh2_a.lib,如果nmake时设置WITH_SSH2=dll,我没有测试过这种情况,请自行处理。
b.在curl根目录\lib\config-win32.h文件中增加代码如下
#ifndef ALLOW_MSVC6_WITHOUT_PSDK
#define ALLOW_MSVC6_WITHOUT_PSDK
#endif
在curl根目录\lib\md5.c文件中增加代码如下
#ifndef   _WIN32_WINNT 
#define   _WIN32_WINNT   0x0400 
#endif
将curl根目录\lib\socks_sspi.c文件中所有的FreeCredentialsHandle修改为FreeCredentialHandle

b.启动命令提示符,执行C:\Program Files\Microsoft Visual Studio\VC98\Bin\vcvars32.bat
c.在命令提示符中进入curl根目录\winbuild,执行nmake /f Makefile.vc mode=static VC=6 WITH_SSL=static WITH_ZLIB=static WITH_SSH2=static ENABLE_SSPI=no ENABLE_IPV6=no ENABLE_IDN=no ENABLE_WINSSL=no DEBUG=no MACHINE=x86
上面的nmake命令可以根据你的需要进行修改。
到此,curl的编译全部完成了,curl根目录\builds\libcurl-vc6-x86-debug-static-ssl-static-zlib-static-ssh2-static-spnego\bin
目录下有一个curl.exe,可以用来测试生成的静态库或动态库是否可用。
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

curl,libssh2,openssl,zlib的编译 的相关文章

  • 使用curl解压gzip数据

    I added curl easy setopt client CURLOPT ENCODING gzip 到我的代码 我预计curl 会导致服务器发送压缩数据并解压缩它 实际上我在 HTTP 标头中看到数据被压缩 变化 Accept En
  • openssl-使用密钥和 IV 解密 Base64 字符串

    我正在尝试解密已在 openssl 中使用 aes256 加密的 base64 字符串 我获得了会话密钥和 IV 它们是用我的密钥加密的 我将它们转换为十六进制 以便可以使用以下 openssl 命令 openssl enc d aes25
  • php如何在curl获取请求标头中使用承载令牌?

    下面是一个有效的 C get 请求 public HttpResponseMessage ExecuteEndPoint string endpoint string accessTocken HttpResponseMessage res
  • 从curl的输出中提取模式

    我想在命令行上使用curl 来获取一个url 将其通过管道传递给一个模式 然后返回与该模式匹配的url 列表 我遇到了该模式贪婪方面的问题 并且似乎无法克服它 对此的任何帮助将不胜感激 curl http www reddit com r
  • 为什么 OpenSSL 给我一个“调用了不应调用的函数”错误?

    我正在努力向我的服务器程序添加 OpenSSL 支持 通常它运行得很好 但我遇到了一个问题 首先 一些背景知识 服务器是单线程的 使用非阻塞 I O 和 select 循环来同时处理多个客户端 服务器链接到 libssl 0 9 8 dyl
  • 为什么 PHP 中加密的内容与 Ruby 中加密的相同字符串不匹配?

    这是我的要求 我需要使用 AES 加密 包括随机 iv 对 PHP 中的字符串进行加密 对其进行 Base64 编码 然后对其进行 URL 编码 以便可以将其作为 URL 参数传递 我试图在 PHP 和 Ruby 中获得相同的结果 但我无法
  • 可以从curl访问docker服务,但不能从postman/chrome访问docker服务

    我正在做 docker 入门指南 https docs docker com get started part3 recap and cheat sheet optional https docs docker com get starte
  • 带代理的 PHP CURL 导致套接字上的 CLOSE_WAIT

    我正在使用 PHPcurl 库来建立连接并从 WEB 检索内容 通常 我有多个 SOCKS5 代理服务器在 localhost 上运行 端口从 10300 到 10350 PHP 随机选择一个端口 My code ch curl init
  • 从 X.509 证书中提取 PEM 公钥

    我已经创建了一个包含公钥 DER 文件的证书 但我现在需要 PEM 格式的公钥用于不同的平台 目的是使用相同的公钥 我使用创建它iOS 中的 RSA 加密并使用 PHP 解密 http jslim net blog 2013 01 05 r
  • 无法验证 SSL 证书

    我想做的事 与以下人员保持干净的联系openssl connect到远程站点 网站似乎是自签名的 What I m getting CONNECTED 00000003 depth 0 CN DC01 home pri verify err
  • 使用curl作为fgetcsv的fopen文件资源的替代品

    是否可以制作curl 访问url并将结果作为文件资源 就像 fopen 是如何做到的 我的目标 解析 CSV 文件 将其传递给 fgetcsv 我的障碍 fopen被禁用 我的代码块 在 fopen 中 url http download
  • 对 smtp.live.com 和 TIdSmtp(Indy、Delphi)的 SSL 支持

    我正在尝试连接到 smtp live com 发送电子邮件 live com 自 2009 年以来显然支持免费的 pop3 smtp 但这对我来说完全是新闻 当我尝试连接到 smtp live com 端口 587 时 会发生以下情况 Me
  • pip:证书失败,但curl 有效

    我们在客户端安装了根证书 https 连接适用于curl 但如果我们尝试使用pip 它失败 Could not fetch URL https installserver 40443 pypi simple pep8 There was a
  • 如何使用 PHP 发送 OPTIONS 请求

    有谁知道如何使用 PHP 发送 OPTIONS 请求 我找不到执行此操作的curl setopt 我正在使用 php 5 6 7 我已经弄清楚了 GET POST DELETE 和 PUT 只需要选项 我已经尝试过以下 hd 的答案 ch
  • 使用openssl从服务器获取证书

    我正在尝试获取远程服务器的证书 然后可以将其添加到我的密钥库中并在我的 Java 应用程序中使用 一位高级开发人员 正在度假 告诉我我可以运行这个 openssl s client connect host host 9999 获取转储的原
  • curl 在命令行中工作正常,但在 php 中不行

    我使用curl 从 PHP 中检索 url 的内容 它适用于大多数 url 但对于某些 url 它只返回一个空字符串 从命令行 卷曲 此类 url 效果很好 这是我运行curl的方式 curl session curl init site
  • Stripe Connect - 检索访问令牌

    我正在尝试为 Rails 3 2 13 应用程序设置 Stripe Connect 我已将用户引导至 Stripe 并收到了来自 Stripe 的授权码 HTTP 1 1 302 Found Location http localhost
  • 如何修改s_client的代码?

    我正在玩apps s client c in the openssl源代码 我想进行一些更改并运行它 但是在保存文件并执行操作后 我的更改没有得到反映make all or a make 例如 我改变了sc usage函数为此 BIO pr
  • 在 cURL 命令和 postman 中的 Firebase Cloud Messaging 中获取无效令牌

    伙计们 我正在尝试获取有关应用程序实例的信息 并且我还尝试将应用程序实例订阅到 Google Cloud Messaging 主题 但问题是每当我尝试使用server key它给我带来了错误invalid token当我尝试使用web ap
  • 如何将 OpenSSL 与 WinSock 一起使用?

    我在网上搜索过 但没有找到任何与此相关的内容 有谁有使用 WinSock 和 OpenSSL 的简单代码示例吗 我正在寻找一个简单的 Visual C 2005 或更高版本的代码示例 它创建并打开一个 Winsock 连接 并使用 Open

随机推荐

  • 重点必考题:区块链百万年薪人才招聘,必会这58个知识点

    2018年区块链行业热度不减 投资人青睐 创业者追捧 而区块链人才成了稀缺性物种 拉勾网发布的 2018年区块链高薪清单 中 腾讯 阿里等大厂将区块链岗位的月薪最高开到了100K 有相关数据统计 2月份北京区块链岗位增加了3万多个 技术类2
  • ovirt简介

    Ovirt 调研 简介 架构 功能模块和列表 虚拟化所用的技术 kvm 是否支持分布式存储以及所用的技术 支持 gluster 虚拟网络能够实现哪些功能 VLAN 在虚拟机上最小化部署一套 简介 oVirt是一种开源分布式虚拟化解决方案 旨
  • wang_ys121账号停用及博客迁移至wonyoungsen的说明!

    从今天起 本账号wang ys121停止使用 不再更新博文 并将此账号博文逐步迁移到新的账号wonyoungsen中去 请喜欢我的同学继续关注我 谢谢
  • 远程链接redis遇到的坑

    1 安装redis参考 https cloud tencent com developer article 1653709 安装完后一直无法启动redis Dec 28 13 12 05 hecs 22391 systemd 1 Start
  • 【可视化开发】echarts点击事件

    echarts提供了点击事件方法 首先需要确定点击的范围 以横向柱状图为例 若不设置属性 添加点击事件后默认为柱型 设置可点击属性 需添加以下配置 yAxis 其余属性 silent false 坐标轴是否是静态无法交互 triggerEv
  • linux 中 安装 redis

    cd usr mkdir redis cd redis wget http download redis io releases redis 3 2 4 tar gz tar xzf redis 3 2 4 tar gz cd redis
  • PyTorch 矩阵乘法的方法总结 & 问题解答

    在机器学习和深度学习中时 矩阵运算是最常见 有效提高计算效率的方法 因为特征和权重都以向量储存 矩阵运算就显得尤为重要 诸如梯度下降 反向传播 矩阵因子分解等重要的机器学习方法 都需要基于矩阵运算 在深度学习中 神经网络将权重储存在矩阵当中
  • Java连接MySQL

    目录 1 JDBC简介 2 使用 JDBC 连接数据库 2 1 使用流程 3 详细操作 3 1 导入 jar 包 4 通过 java 语言操作数据库 4 1 连接 Mysql 数据库 4 2 增 删 改 查操作 5 部分问题 5 1 数据库
  • Spring-Data-JDBC 自定义枚举类型 转换遇到的bug (搞了半天,在 insuess中看到)

    解决思路 bug描述 issuse地址 解决方法
  • qt中如何模拟按钮点击_qt模拟键盘的三种实现方式(思路+demo)

    按照我自己的理解 qt模拟键盘分三个层次的模拟 1 单线程的模拟 2 qt框架内的模拟 可以跨线程的 3 在操作系统的图形界面内模拟 相当于模拟了一个输入法 第一种 一般就是添加多个按键 QToolButton QPushButton都可以
  • RTThread:静态线程&动态线程

    一 静态线程创建 rt thread init rt err t rt thread init struct rt thread thread const char name void void parameter entry void p
  • ❀资源帖❀ResNet,ConvNeXt,Transformer预训练模型等

    1 说在前面 部分输入网页直接开始下载 一些是自己训练后的模型 2 resnet权重文件下载地址 2 1resnet18 https download pytorch org models resnet18 5c106cde pth 2 2
  • 关于OPC UA TSN中TSN

    近日 TTTech和英特尔联合发表了一份白皮书 为寻求在工业自动化系统中实现TSN网络技术的客户提供指导 白皮书概述了所有的TSN标准 优点和特点 并描述了TTTech和英特尔今天可用的产品如何可用于开发优化的TSN设备和系统 TSN将重塑
  • 巧用WINRAR和DOS命令处理压缩数据

    开展计算机审计 首先要取得被审计单位的电子数据 然后将数据标准化 即将被审计单位提供的数据转换成便于审计人员使用的 SQL Server 或其他数据库格式的数据 因此 计算机审计首先要解决的是数据标准化问题 许多商业银行采取按天备份的策略
  • 记一次Tomcat日志分析:一个或多个listeners启动失败,更多详细信息查看对应的容器日志文件

    1 问题 我将一个应用 MicroStrategy 11 3 0000 13515 部署到Tomcat 然后 我点击start后报错 FAIL Application at context path MicroStrategy 11 3 0
  • 网络图库Cytoscape.js的使用(二):图表常用操作

    文章目录 图形实例与集合 选择器 常用函数 获取指定元素 集合 视口常用操作 数据 全局常用方法 元素常用数据 操作方法 修改元素样式常用方法 迭代 构建 过滤常用方法 图形实例与集合 为了使用Cytoscape js 架构中有两个部分是程
  • Git安装教程

    文章目录 Git安装教程 一 Git安装与下载 二 Git 的功能介绍 三 测试Git是否安装成功 Git安装教程 一 Git安装与下载 浏览器搜索Git官方下载或https git scm com downloads 官网可能下载慢 阿里
  • Spring Cloud是什么?

    Spring Cloud 是一款基于 Spring Boot 实现的微服务框架 Spring Cloud 源自 Spring 社区 主要由 Pivotal 和 Netflix 两大公司提供技术迭代和维护 随着微服务的火爆流行 国内外各大互联
  • nacos-一致性协议(1)

    Nacos支持CP AP模式 即Nacos可以根据配置识别为CP模式或AP模式 默认是AP模式 如果注册Nacos的client节点注册时ephemeral true 那么Nacos集群对这个client节点的效果就是AP 采用distro
  • curl,libssh2,openssl,zlib的编译

    前年 客户要求ATM客户端程序添加sftp功能 领导发给我4个静态库 分别是libcurl lib libeay32 lib ssleay32 lib libssh2 lib 使用这4个库成功实现了sftp功能 当时从网络上查到该四个静态库