【C++进阶】详解C++开源网络传输库libcurl的编译过程

目录

1、引言

2、直接编译libcurl工程,提示找不到ssh.h

3、下载并编译libssh2开源代码,部署到libcurl目录中

4、获取openssl开源库的头文件和库文件,部署到libcurl目录中

5、将编译好的libcurl拿到测试项目中测试

6、使用CMake工具手动生成VS工程文件,可以轻易地编译出libcurl库

7、总结


       libcurl是一个免费开源的网络传输库(the multiprotocol file transfer library),支持ftp、ftps、http、https、telnet、ldap、pop3、smtp、rtmp、rtsp、smb等多种协议。libcurl中封装了支持这些协议的网络通信模块,支持跨平台,支持Windows,Unix,Linux等多个操作系统。libcurl提供了一套统一样式的API接口,我们不用关注各种协议下网络通信的实现细节,只需要调用这些API就能轻松地实现基于这些协议的数据通信。本文我们来详细讲述一下如何编译开源的libcurl库。

1、引言

       之前开发的一个工具软件中有个发送告警邮件的功能,最开始试图通过socket套接字去实现邮件的发送,先是和邮件服务器建立连接,然后进行SMTP邮件的协商,协商完成后将邮件发送出去。结果联调测试时遇到了一堆问题,各种网络异常没有得到很好的处理,导致发送邮件功能根本没法使用。

       后来想到了libcurl开源库,该库中封装了smtp邮件协议的所有功能,从连接到协议协商,再到邮件数据的发送,提供一套完整、可靠、稳定的邮件发送机制。于是想去下载libcurl的开源代码,手动将库编译出来,然后再拿到工具软件中使用,同时也正好熟悉一下libcurl开源库的编译过程。

       关于发送告警邮件的项目,可以查看之前写的文章:(下列文章中提供免费C++源码项目下载

IPC摄像头在线状态ping检测与告警邮件发送项目总结(提供源码下载)

https://blog.csdn.net/chenlycly/article/details/120690137

2、直接编译libcurl工程,提示找不到ssh.h

       到libcurl的官网上下载libcurl源码。我下载的是2022年5月11日发布的curl 7.83.1版本。解压后,打开curl-7.83.1\projects\Windows目录,该目录中保存了支持Widnows平台上的Visual Studio编译的工程文件,提供了对多个Visual Studio版本的支持:

此处我是用Visual Studio 2010编译的,所以选择VC10目录。打开VC10目录,双击curl-all.sln解决方案文件启动VS2010打开解决方案,该解决方案中包含了curl和libcurl两个工程,libcurl是动态库工程,我们编译该工程就可以了。

在libcurl源代码根路径中提供了CMakeLists.txt文件,如果开源库中不提供支持Visual Studio编译的工程文件,我们可以对CMakeLists.txt文件使用CMAKE工具,生成指定版本的Visual Studio工程文件。注意在使用CMake工具时,开源代码的所在路径必须是全英文的,不能包含中文,否则CMake工具会将路径中的中文字符识别位乱码,导致生成Visual Studio工程文件失败。

        启动对libcurl工程的编译后,就报错了,如下所示:

1>------ 已启动生成: 项目: libcurl,配置: DLL Release - DLL OpenSSL Win32 ------
1>生成启动时间为 2022/5/17 16:32:39。
1>InitializeBuildStatus:
1>  正在创建“..\..\..\..\build\Win32\VC10\DLL Release - DLL OpenSSL\lib\libcurl.unsuccessfulbuild”,因为已指定“AlwaysCreate”。
1>ClCompile:
1>  x509asn1.c
1>  wolfssl.c
1>  vtls.c
1>e:\开源库集合\curl-7.83.1\lib\vssh/ssh.h(28): fatal error C1083: 无法打开包括文件:“libssh2.h”: No such file or directory
1>  sectransp.c
1>e:\开源库集合\curl-7.83.1\lib\vssh/ssh.h(28): fatal error C1083: 无法打开包括文件:“libssh2.h”: No such file or directory
1>  schannel_verify.c

提示找不到ssh.h。从解决方案配置中看到了libssh2库的身影,应该是当前的libcurl库使用了开源的libssh2库,于是去下载libssh2开源库代码,一是拿到libssh2库的头文件,二是将libssh2库的库文件编译出来,libcurl链接时肯定要用到libssh2库的。

3、下载并编译libssh2开源代码,部署到libcurl目录中

       SSH为Secure Shell的缩写,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH1由于存在安全漏洞,所以产生了更为安全的SSH2,开源libssh2库实现了SSH2协议。

       到libssh2官网上下载libssh2源码,解压后打开根路径,发现根路径下有个win32文件夹,点进去后看到Visual Studio相关的工程文件,如下所示:

工程文件是VC++6.0版本的,直接将工程文件拖到VS2010中,将工程文件升级到VS2010版本,然后发起编译,很快就编译完成了。

       查看了一下libssh2工程的属性,发现该工程编译出来的是静态库,不是动态库,如下所示:

因为此处生成的是libssh2静态库,所以我们在libcurl的解决方案配置中选择“DLL Release - DLL OpenSSL”工程选项:

这个选项是使用libssh2静态库的。而DLL Release - DLL OpenSSL - DLL LibSSH2选项中则使用的是libssh2动态库,所以我们要使用前者。

       于是将libssh2库目录中的include头文件以及编译出来的静态库拷贝到libcurl的工程目录curl-7.83.1中。我们在curl-7.83.1目录中创建一个名叫libssh2文件夹,然后在该文件夹中创建一个用来存放头文件的include文件夹和一个用来存放libssh2静态库的lib文件夹,如下:

        于是我们到libcurl的工程属性中修改一下配置,首先修改引用libssh2\include下头文件的路径(包含头文件):

然后修改引用libssh2\lib目录下的libssh2.lib文件的路径(链接时引入的.lib文件):

       于是继续编译libcurl工程,结果又提示找不到ssl.h头文件:

1>------ 已启动生成: 项目: libcurl,配置: DLL Release - DLL OpenSSL Win32 ------
1>生成启动时间为 2022/5/17 17:01:17。
1>InitializeBuildStatus:
1>  正在对“..\..\..\..\build\Win32\VC10\DLL Release - DLL OpenSSL\lib\libcurl.unsuccessfulbuild”执行 Touch 任务。
1>ClCompile:
1>  x509asn1.c
1>  wolfssl.c
1>  vtls.c
1>  sectransp.c
1>  schannel_verify.c
1>  schannel.c
1>  rustls.c
1>  openssl.c
1>..\..\..\..\lib\vtls\openssl.c(63): fatal error C1083: 无法打开包括文件:“openssl/ssl.h”: No such file or directory
1>  nss.c
1>  mbedtls_threadlock.c

应该是和libssh2库一样,也需要获取openssl开源库的头文件和库文件。

4、获取openssl开源库的头文件和库文件,部署到libcurl目录中

       到curl-7.83.1目录中去搜索,也找不到ssl.h文件。那应该是要去下载openssl开源库的源码并编译。到openssl官网上将源码下载下来,解压后在根路径中没有找到Windows平台编译专用的Visual Studio的工程文件,而libcurl和libssh2源码中是有专用的Visual Studio工程文件的。如果要手动编译openssl,则需要安装perl工具,然后通过perl去执行代码的编译,这个过程略显复杂。

       我们可以到第三方网站上去下载别人已经编译好的openssl库,比如:

Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions

http://slproweb.com/products/Win32OpenSSL.html

打开页面后,将页面向下拉动找到下载链接,我们的软件是32位的,所以选择32位版本的openssl即可。但下载链接比较多,我们只需要选择Win32 OpenSSL v3.0.3 Light版本即可,点击MSI按钮,下载MSI安装包:

然后执行该MSI安装包,这样就能把openssl头文件和库文件释放到目标路径中。然后打开安装目录查看安装的内容,从include路径中取出所有头文件,从lib路径中取出用于链接的.lib库,从bin路径中取出libssl-3.dll及其依赖的库。

       lib路径中的文件比较多:

我们只需要取出libcurl链接时要用的libssl.lib库文件即可。

       bin路径下的文件也比较多,除了要拿openssl库的主文件libssl-3.dll,还要取出哪些libssl-3.dll库依赖的dll文件呢?其实很简单,我们只需要使用Dependency Walker工具打开libssl-3.dll文件,看看libssl-3.dll依赖哪些dll库,如下所示:

除去libssl-3.dll依赖的一些系统库之外,我们看到了libssl-3.dll依赖了libcrypto-3.dll库,

在这个地方有个细节需要注意一下,Dependency Walker工具在Win10系统中打开dll很慢,等待的时间会比较长,估计得等1分钟左右,使用时要去耐心等待一会,等待Dependency Walker打开dll库完成,估计是因为Dependency Walker对Win10的兼容性不好导致打开dll文件很慢的。

       和libssh2库处理类似,我们也在curl-7.83.1目录的根目录中创建一个openssl目录,在该目录再创建一个存放openssl头文件夹include,再创建一个存放.lib和.dll文件的lib路径。然后从之前Win32 OpenSSL v3.0.3 Light的安装目录中将相关文件拷贝过去。

       接下来,我们到libcurl的工程属性中修改一下配置,首先修改引用openssl\include下的头文件路径(包含头文件):

然后修改引用openssl\lib目录下的libssl.lib文件的路径(链接时引入的.lib文件):

于是再编译libcurl工程,结果还是报找不到ssl.h头文件的错误:

1>------ 已启动生成: 项目: libcurl,配置: DLL Release - DLL OpenSSL Win32 ------
1>生成启动时间为 2022/5/17 17:01:17。
1>InitializeBuildStatus:
1>  正在对“..\..\..\..\build\Win32\VC10\DLL Release - DLL OpenSSL\lib\libcurl.unsuccessfulbuild”执行 Touch 任务。
1>ClCompile:
1>  x509asn1.c
1>  wolfssl.c
1>  vtls.c
1>  sectransp.c
1>  schannel_verify.c
1>  schannel.c
1>  rustls.c
1>  openssl.c
1>..\..\..\..\lib\vtls\openssl.c(63): fatal error C1083: 无法打开包括文件:“openssl/ssl.h”: No such file or directory
1>  nss.c
1>  mbedtls_threadlock.c

后来查阅代码得知,代码中引用ssl.h头文件的地方,都加上了openssl相对路径,如下:

       为了解决这个问题,我们再在include中添加一个openssl子文件夹,将所有openssl的头文件都搞到这个openssl子文件夹中存放,然后libcurl就能编译通过了。

5、将编译好的libcurl拿到测试项目中测试

       将编译好的release版本的libcurl库及其依赖的几个库,拷贝到之前编写的包含发送邮件的程序中编译,运行测试程序,打开邮箱参数设置窗口,如下所示:

在邮箱参数设置窗口中填写好163邮箱SMTP服务器地址及端口、发送邮件地址和接收邮件通知的接收邮件地址,点击“发送接收邮件”按钮,发送测试邮件。经验证,是可以将测试邮件发出去的:

目标邮箱中也是能收到邮件的,邮件内容也是正确的。

       至于如何开通发送邮件中的SMTP服务,可以参见之前写的这篇文章:

VC++调用libcurl开源库实现发送邮件的功能(附源码)

https://blog.csdn.net/chenlycly/article/details/121318616

6、使用CMake工具手动生成VS工程文件,可以轻易地编译出libcurl库

       libcurl开源代码的根目录中就有个CMakeLists.txt文件,该文件中配置了生成Windows平台上的Visual Studio工程文件的相关内容,于是使用CMake工具尝试自行生成VS工程文件。

CMake 是一个跨平台的开源构建系统,通过读取放置在每个源码根目录中的配置文件CMakeLists.txt中的内容,生成指定平台的标准构建文件,比如为 Unix 平台生成makefiles文件(用GCC编译),为 Windows平台的MSVC(Microsoft Visual Studio C++)生成 projects/workspaces(用Visual Studio编译)或makefile文件(用nmake编译)。

       打开CMake工具后,先设置libcurl源码的根路径,然后再设置生成的Visual Studio工程文件的目录:

然后点击Generate按钮,弹出选择哪种解决方案:

此处我们需要使用VS2010,所生成VC++工程文件的时间比较长,大概需要等待几分钟时间,生成完成后,我们打开对应的目录,如下所示:

打开后编译libcurl工程即可,编译速度很快。根据编译时打印的信息得知,该种方式下使用的是wolfssl,没有使用openssl,libcurl的目录中也找不到openssl的头文件,所以通过CMake工具生成的VS工程编译时不需要libssh2和openssl开源库了,如下:

根据编译输出的路径,可以到对应的路径中找到生成的libcurl库文件:libcurl_imp.lib和libcurl.dll。

        相比于上面那种编译libssh2开源库及获取openssl库的方式,这种方式要简单的多。将libcurl_imp.lib和libcurl.dll拿到测试工具的工程中测试,也是能正常发送邮件的。

7、总结

       上面使用了两个途径去编译libcurl库。一种是使用libcurl开源库自带的VS工程去编译,但要先去编译libssh2开源库,然后去获取openssl开源库的头文件及库文件,最后再来编译libcurl工程。另一种方式是使用CMake工具,输入CMakeLists.txt,即可自动生成VC的工程,可以直接编译出libcurl库,不需要再去编译libssh2和openssl库。经测试,这两种方式编译出来的库都是可用的,都能将测试邮件发送出去。

原文地址:https://blog.csdn.net/chenlycly

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读2.2k次,点赞6次,收藏20次。在我们平时办公工作中,很多时候我们经常会使用到虚拟机来进行环境的测试,我们平时在虚拟机上接触的最多的莫过于Linux和Winwdos。不过虚拟机环境和物理机环境是无法直接传输的,那么有的时候呢,同学们又想要在两者之间相互传输文件,可能就会使用QQ邮箱等形式来传输,这样的效率又慢而且繁琐,今天我就为大家带来一种非常便捷的传输方式。通过XFTP工具来进行文件传输。_xftp连接windows
文章浏览阅读1k次。解决 Windows make command not found 和 安装 GCC 环境_windows下载gcc
文章浏览阅读3.2k次,点赞2次,收藏6次。2、鼠标依次点击“计算机配置“ - ”管理模板“ - ”网络“ - ”Lanman工作站”,点击右侧的“启用不安全的来宾登录”策略。Windows访问samba共享时,提示“你不能访问此共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问”1、键盘按下window+R键,输入gpedit.msc,启动本地组策略编辑器。首先在终端中输入sudo ufw status查看当前防火墙状态。默认状态是“未配置”,修改为“已启用”。示例:创建一个narada的目录在/home下。1.更新apt储存库列表。_ubuntu samba 目标文件夹访问被拒绝
文章浏览阅读1.3w次。蓝光版属于高清版的一种。BD英文全名是Blu-ray Disc,一种高清的电影版本,这种电影十分清晰但是数据量巨大,占数十G甚至上百G的容量,只有蓝光光碟才能装得下,所以这种高清电影被称为BD版。一般的高清电影多半是从蓝光电影、国外的高清电视频道上压制而来的,可以通过网络下载,多数都经过二次压缩,画质要逊于原视频,不过压缩后的容量从蓝光的25G-50G会减少成4G-8G等(15G-20G不等)。众所周知,视频有两种常见的清晰度,BD和HD,在看电影的时候最常出现这两个标志,那么BD和HD具体指的是什么呢?_bd hd
文章浏览阅读974次,点赞7次,收藏8次。提供了更强大的功能,因为它允许直接访问当前元素,而不需要类型转换。接口,它可以提供一个迭代器,用于按顺序访问集合中的元素。接口是只读的,它只能支持前向迭代,不能修改集合中的元素。类型的集合实例,并向其中添加了几个元素。接口,可以创建一个能够迭代访问泛型集合中元素的迭代器。接口,我们可以在 C# 中实现可迭代的集合,并使用。循环和迭代器手动遍历集合,并输出每个元素的值。接口表示一个可枚举的集合,它定义了一个方法。属性,用于获取集合中当前位置的元素。存储集合中的元素,并实现了。的泛型集合类,它实现了。
文章浏览阅读1.4w次,点赞5次,收藏22次。如果使用iterator的remove方法则会正常,因为iterator的remove方法会在内部调用List的remove方法,但是会修改excepedModCount的值,因此会正常运行。因为遍历过程中进行remove 操作时,该位置后面的元素会挤到前面来,这时候会发生一种情况就是原来元素的位置会被他后面的元素取代,而该位置已经遍历过了,所以该元素不会背遍历。当我们倒序遍历元素的时候,无论删除元素之后的元素怎么移动,之前的元素对应的索引(index)是不会发生变化的,所以在删除元素的时候不会发生问题。_list删除某个元素
文章浏览阅读2.9w次,点赞45次,收藏192次。Windows下配置Visual Studio _vs2022环境变量配置
文章浏览阅读7w次,点赞162次,收藏778次。pip 是Python包管理工具,提供了对 Python 包的查找、下载、安装、卸载的功能,目前Python 3.4 和 2.7 及以上版本都有配套安装,一般pip的位置在...pythonScripts文件夹里面,而在其他版本需要自行下载。_python pip install安装
文章浏览阅读5.8k次,点赞2次,收藏12次。①此电脑右击----->选择属性----->高级系统设置----->环境变量----->path----->编辑----->新建。第一个选项意思就是将安装路径填入到系统环境变量中,这里勾选,后面使用可能会出现问题,建议不要勾选,安装好之后手动添加环境变量。注意:如果提示conda不是内部或外部命令,原因是Anaconda的环境变量没配置好。如果不想立即打开anaconda,不勾选直接finish就好。②输入 conda --version ,查看conda环境。②直接按win键,搜索“环境变量”_windows安装anaconda
文章浏览阅读5.1k次,点赞8次,收藏55次。Windows 系统从零配置 Python 环境,安装CUDA、CUDNN、PyTorch 详细教程_windows cuda cudnn配置
文章浏览阅读1.5w次,点赞54次,收藏68次。macOS系统自带有VNC远程桌面,我们可以在控制端上安装配置VNC客户端,以此来实现远程控制macOS。但通常需要在不同网络下进行远程控制,为此,我们可以在macOS被控端上使用cpolar做内网穿透,映射VNC默认端口5900,通过所生成的公网地址,来实现在公网环境下远程控制VNC。_vnc mac
文章浏览阅读2.4k次,点赞5次,收藏11次。进入后根据自己的电脑系统下载,这是python 3.10版本下载地址,如果想要下载其它版本可进入此链接(下载完成后点击进行安装点击下一步,到这一步时,可以选择将Anaconda添加我的PATH环境变量中,这样就不用自己手动配置和环境变量。安装完成后,打开终端,输出 python 命令可查看是否安装成功。如果显示自己刚才安装的版本号说明安装成功。查看conda版本命令:conda info。_paddlespeech下载
文章浏览阅读3.3k次。所以如果要删除之前新增的课程编译原理,只需输入命令del Course:8:Cname,同时还应该把本课程的学分删除del Course:8:Ccredit,如下图所示;Redis并没有修改数据的命令,所以如果在Redis中要修改一条数据,只能在使用set命令时,使用同样的键值,然后用新的value值来覆盖旧的数据。先调用get命令,输出原先的值,然后set新的值,最后再get得到新值,所以修改成功。输入命令后没有报错,表示成功了,刷新windows的服务,多了一个redis服务。_redis windows服务
文章浏览阅读2.1w次,点赞9次,收藏56次。​​接着在【工作负荷】中,选择【使用C++桌面开发】 ,右边【安装详细信息】去除其它可选项,只勾选【MSVCv142 】和 【Windows 10 SDK】,按图示修改,然后右下角点击安装,之后会有提示让你重启电脑。重启电脑之后,再进行pip安装。报错原因是pip所安装的包需要使用C++编译后才能够正常安装,但是当前安装环境中缺少完整的C++编译环境,因此安装失败。3.安装Microsoft Visual C++ Build Tool离线安装包(1个多G),CSDN资源很多,需要积分下载,_error: microsoft visual c++ 14.0 or greater is required. get it with "micros
文章浏览阅读1.1w次,点赞3次,收藏7次。Step 3: 在右侧窗口中找到名称为“LongPathsEnabled”的“DWORD (32 位) 值”条目,并双击它。通过注册表方法或组策略方法启用长路径支持后,您将能够在 Windows 中使用长路径,并能够访问和处理长路径下的文件和文件夹。Step 2: 依次选择“计算机配置” > “管理模板” > “系统” > “文件资源管理器”。Step 3: 找到“启用 Win32 长路径”设置,双击它。Step 4: 选择“已启用”选项按钮,然后选择“应用”按钮。_windows长路径支持
文章浏览阅读2.5k次,点赞81次,收藏86次。
文章浏览阅读1.3k次,点赞65次,收藏50次。顺序表,链表,栈,队列,ArrayList,LinkedList,Stack,Queue
文章浏览阅读2.3k次,点赞2次,收藏2次。AnyTXTSearcher是一款能够帮助我们对文档以及文本内容进行快速搜索和管理的工具,通过该软件能够搜索各种Office文档,文本文件,代码,PDF文档等,顶级的全文搜索引擎1秒钟之内即可完成搜索。_anytxt searcher
文章浏览阅读8.8k次,点赞73次,收藏70次。有时,在删除/移动/重命名文件夹/文件时,会遇到如下警告,即使将打开的程序关闭了,后台也可能会有没关干净的相关进程。_解除占用
文章浏览阅读4.3w次,点赞91次,收藏102次。JDK(Java Development Kit)是Java开发工具包的缩写,包含了Java编译器、Java虚拟机、Java类库等众多组件,是Java开发的基石,提供了编写、编译和运行Java程序所必需的工具。同时,为了让系统能够正确识别Java环境,在开始使用JDK进行Java开发之前,需要先把JDK安装到本地计算机,并配置好相应的环境变量。本文将介绍JDK安装与环境变量配置的方法。_windows安装jdk并配置环境变量