热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C++编译调用libcurl库(包括编译引用openssl,zlib库)

本教程开发平台:windows7libcurl-多协议文件传输库简介:libcurl是一个免费且易于使用的客户端URL传输库,支持DICT,

本教程开发平台: windows 7

 

libcurl-多协议文件传输库简介:

    libcurl是一个免费且易于使用的客户端URL传输库,支持DICT,FILE,FTP,FTPS,Gopher,HTTP,HTTPS,IMAP,IMAPS,LDAP,LDAPS,MQTT,POP3,POP3S,RTMP,RTMPS, RTSP,SCP,SFTP,SMTP,SMTPS,Telnet和TFTP。libcurl支持SSL证书,HTTP POST,HTTP PUT,FTP上传,基于HTTP表单的上传,代理,COOKIE,用户+密码验证(基本,摘要,NTLM,协商,Kerberos),文件传输恢复,http代理隧道等等!

    libcurl具有高度的可移植性,它可以在众多平台上构建并完全相同,包括Solaris,NetBSD,FreeBSD,OpenBSD,Darwin,HPUX,IRIX,AIX,Tru64,Linux,UnixWare,HURD,Windows,Amiga,OS / 2,BeOs,Mac OS X,Ultrix,QNX,OpenVMS,RISC OS,Novell NetWare,DOS等

    libcurl是免费的,线程安全的,与IPv6兼容的,功能丰富,得到良好支持,快速,文档详尽,并且已被许多知名,大型和成功的公司使用。

    libcurl官网地址:https://curl.haxx.se/libcurl/

 

 

工具软件准备(列出的是我本地的工具,版本不限):

Visual studio 2019

官网下载地址:https://visualstudio.microsoft.com/zh-hans/downloads/

Qt Creator 4.10.1

官网下载地址:http://download.qt.io/official_releases/qtcreator/

ActivePerl 5

官网下载地址:http://www.activestate.com/activeperl/downloads

NASM 2.11

官网下载地址:http://www.nasm.us/pub/nasm/releasebuilds/2.11.05/win32/nasm-2.11.05-installer.exe

如果本机没有的,请将需要准备的软件下载到本地。

 

 

ActivePerl工具下载安装配置:

    将ActivePerl-5.20.2MSWin32.zip下载到本地后,进行解压,然后双击ActivePerl-5.20.2MSWin32.msi进行安装,安装完成后,将C:\Perl\bin添加到系统环境变量中(这里请配置自己的安装路径 ),然后到控制台进行测试,成功如下图

 

 

 

NASM工具下载安装配置:

nasm-2.11.05-installer.exe下载到本地后,自己将行安装,然后C:\Program Files (x86)\nasm添加到系统环境变量中(这里请配置自己的安装路径 ),然后到控制台进行测试,成功如下图

 

 

 

nmake配置检测:

Nmake在visual studio安装目录下,在控制台进行检测,如果没有请到进行查询,然后配置到系统环境变量中,测试正常如下图

 

 

 

下载编译openssl:

官网地址:http://www.openssl.org/source/

Github地址:https://github.com/openssl/openssl

Ps:下面提到的d:/cpplib目录是教程本地的,根据需要可以自定义

教程中下载的是openssl-OpenSSL_1_1_1-stable,进行解压,然后复制一份并重命名到d:/cpplib/openssl;

新建目录:d:/cppli/openssl_lib

然后打开vs2019命令行工具:

 

在开始之前我们先阅读一下软件包下面的INSTALL文档是有说明的,建议多看几遍,

接下来在我们打开的vs控制台,将目录切换到d:/cpplib/openssl,开始执行命令(命令参数不懂请看文档):

$ perl Configure VC-WIN32 --prefix=d:/cpplib/openssl_lib no-asm

$ nmake

$ nmake test

$ nmake install

$ nmake clean

执行成功后,d:/cpplib/openssl_lib中生成如下四个文件夹

 

 

 

下载编译zlib:

官网地址:http://zlib.net/zlib-1.2.8.tar.gz

教程中下载的是zlib-1.2.8,下载后进行解压,然后复制一份并重命名到d:/cpplib/zlib;

切换vs控制台,将目录切换到d:/cpplib/zlib,开始执行命令:

$ nmake -f win32/Makefile.msc

执行完成后如下图会出现编译好的库

 

 

 

下载编译libcurl:

下载地址:https://curl.haxx.se/download/curl-7.70.0.zip

下载后将压缩包进行解压, 然后复制一份并重命名到d:/cpplib/curl;

如果您的程序不需要ssl,如https等,这些步骤便可不执行,该包直接即可使用。

然后我们进入到curl/winbuild目录中,阅读几遍BUILD.WINDOWS.txt文档,其中有一段是告诉我们,如果要开启zlib,openssl等功能,需要准备的工包以及编译前应该按自私样的文件格式存放进行

 

所以我们需要新建目录d:/cpplib/deps,这里的deps目录与curl目录同级

然后在里面再新建 三个文件夹 lib ,include , bin

接下来将我们前面编译好的openssl动态库从d:/cpplib/openssl_lib/lib中将libssl.lib,libcrypto.lib复制到d:/cpplib/deps/lib中,

将d:/cpplib/openssl_lib/include中的Openssl文件夹复制到d:/cpplib/deps/include目录中,

接下来将编译好的zlib动态库从d:/cpplib/zlib中将zdll.lib , zlib.lib , zlib1.dll 复制到d:/cpplib/deps/lib中,

将d:/cpplib/zlib/目录中的zconf.h , zlib.h , zutil.h复制到d:/cpplib/deps/include目录中

 

 

切换到vs控制台面板,然后将目录切换到d:/cpplib/curl/winbuild目录,其中执行的命令请多阅读一下BUILD.WINDOWS.txt,接下来按自己的需求执行编译命令

$ nnake /f Makefile.vc mode=dll VC=14 WITH_SSL=dll WITH_ZLIB=dll DEBUG=yes

接下来开始执行编译,这块呢我们分别编译一个debug版本和release版本的库文件

 

编译完成后的文件存放在D:\cpplib\curl\builds\目录下,如图我们需要的文件在红色标出的目录中

 

 

 

 

 

测试:

在项目根目录下分别新建lib,include,certs目录,然后我们到网上下载一个cert证书放到certs目录下,如图

 

然后在D:\cpplib\curl\builds目录中将下图中的库文件复制到项目的lib目录下,将release版本下的include下的curl目录复制到项目下的include目录下

 

 

然后再将我们前面放到deps下文件夹中对应的文件分别复制到项目根目录的lib和include目录下,所有库文件准备到位后,我们开始编码测试

用Qt Creator打开项目文件后,右键项目名>添加库>外部库,然后如图选择libcurl.lib,下一步

 

完成后在配置文件.pro中追加生成一段代码,里面的文件名可能需要进行调整,依自己编译器生成进行调整

1

2

3

4

5

6

win32:CONFIG(release, debug|release): LIBS += -L$$PWD/lib/ -llibcurl

else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/lib/ -llibcurl_debug

else:unix: LIBS += -L$$PWD/lib/ -llibcurl

 

INCLUDEPATH += $$PWD/include

DEPENDPATH += $$PWD/include

 

我们编写的测试源代码如下 :

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

#include 

#include 

#include 

#include 

 

 

using namespace std;

 

static size_t onWriteData(void *buffer, size_t size, size_t nmemb, void *lpVoid){

    string *str = dynamic_cast((string *)lpVoid);

    if(str == nullptr || buffer == nullptr){

        return -1;

    }

    char *pData = (char *)buffer;

 

    fstream fs;

    fs.open("d:/test/sindsun.html", ios::app);

    fs << pData;

    fs.close();

 

    return nmemb;

}

 

int main(){

    curl_global_init(CURL_GLOBAL_ALL);

    CURL *curl &#61;  curl_easy_init();

    string url &#61; "https://www.sindsun.com";

    curl_easy_setopt(curl, CURLOPT_URL, url.c_str());

    //curl_easy_setopt(curl, CURLOPT_POST, 1);

    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, onWriteData);

    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);

    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false);

    string certPath &#61; "E:/cppStudy/EasyHttp/certs/cert.pem";

    curl_easy_setopt(curl, CURLOPT_CAINFO, certPath.c_str());

    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);

    //curl_easy_setopt(curl, CURLOPT_HEADER, 1);

    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);

    CURLcode res &#61; curl_easy_perform(curl);

    cout << "curlcode is " << res << endl;

    if(res !&#61; CURLE_OK){

        fprintf(stderr, "curl_easy_perform() failed: %s\n",

                      curl_easy_strerror(res));

    }

    curl_easy_cleanup(curl);

 

 

    return 0;

}

对于libcurl在代码中的使用&#xff0c;请到官网或者其它网站上进行查阅。

执行后的结果如图&#xff1a;

 

我们获取到的html文件如图

 

到这里就大功告成了。

 

如果您一直未编写成功&#xff0c;我将我编译好的文件分享给您

百度网盘&#xff1a;https://pan.baidu.com/s/18kJhZnpUWFIdtZsRlHIwyw  提取码&#xff1a;vds7

 

写在最后的感受&#xff1a;

    C&#43;&#43;相对其它语言确实是有很多复杂之处&#xff0c;就像这次为了使用libcurl库进行Https请求&#xff0c;一直折腾了四五天&#xff0c;对工具的了解&#xff0c;相关库的下载编译&#xff0c;还有库的调用等等&#xff0c;对于刚刚入门的我真的是一头雾水&#xff0c;没日没夜的查资料研究&#xff0c;最后终于实现了https的请求&#xff0c;过程中收获了不少的知识 &#xff0c;其实挺有意义的。另外一点&#xff0c;虽说这些刚开始复杂了一些&#xff0c;但只要用心研究&#xff0c;多查资料&#xff0c;或者有认识的人的话多请教&#xff0c;解决技术上的一些问题是非常容易的。由于网上的很多教程确实比较零散&#xff0c;我在学习完成 后把这些整理了再来 &#xff0c;希望可以帮助到有需要的朋友&#xff0c;其它方面的应用请自由发挥&#xff0c;分享真的是一件很快乐的事。

 



 


推荐阅读
  • 2016-2017学年《网络安全实战》第三次作业
    2016-2017学年《网络安全实战》第三次作业总结了教材中关于网络信息收集技术的内容。本章主要探讨了网络踩点、网络扫描和网络查点三个关键步骤。其中,网络踩点旨在通过公开渠道收集目标信息,为后续的安全测试奠定基础,而不涉及实际的入侵行为。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • TCP三次握手过程详解与图示解析
    本文详细解析了TCP三次握手的过程,并通过图示清晰展示了各个状态的变化。同时,文章还介绍了四次挥手的图解,解释了在TIME_WAIT状态中,客户端最后一次发送的ACK包的作用和重要性。 ... [详细]
  • Nginx入门指南:从零开始掌握基础配置与优化技巧
    Nginx入门指南:从零开始掌握基础配置与优化技巧 ... [详细]
  • 在 CentOS 6.4 上安装 QT5 并启动 Qt Creator 时,可能会遇到缺少 GLIBCXX_3.4.15 的问题。这是由于系统中的 libstdc++.so.6 版本过低。本文将详细介绍如何通过更新 GCC 版本来解决这一问题。 ... [详细]
  • 用阿里云的免费 SSL 证书让网站从 HTTP 换成 HTTPS
    HTTP协议是不加密传输数据的,也就是用户跟你的网站之间传递数据有可能在途中被截获,破解传递的真实内容,所以使用不加密的HTTP的网站是不 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • 在网络故障排查中,tcpdump 是一款强大的工具,尤其在 Linux 环境下。尽管开发环境中问题较少,但在测试或生产环境中,往往会遇到各种难以预料的异常情况。通过在问题发生的环境中启用 tcpdump 进行抓包,并重现问题,可以获取到宝贵的原始数据,为问题的诊断提供关键线索。本文将详细介绍如何使用 tcpdump 进行实战操作,帮助读者掌握这一技能。 ... [详细]
  • 在使用 `requests` 库进行 HTTP 请求时,如果遇到 `requests.exceptions.SSLError: HTTPSConnectionPool` 错误,通常是因为 SSL 证书验证失败。解决这一问题的方法包括:检查目标网站的 SSL 证书是否有效、更新本地的 CA 证书库、禁用 SSL 验证(不推荐用于生产环境)或使用自定义的 SSL 上下文。此外,确保 `requests` 库和相关依赖项已更新到最新版本,以避免潜在的安全漏洞。 ... [详细]
  • 【Linux】CentOS 7 远程连接指南:高效安全的远程管理方法
    在 CentOS 7 中实现高效且安全的远程管理,本文详细介绍了如何检查和安装配置 OpenSSH。首先,通过 `yum list installed` 命令检查系统是否已安装 OpenSSH,若未安装,则使用 `yum install openssh-server` 进行安装。随后,配置 SSH 服务以确保其安全性和稳定性,包括修改默认端口、禁用 root 登录等关键步骤。此外,还提供了常见问题的解决方案,帮助用户顺利进行远程连接。 ... [详细]
  • 深入解析OSI七层架构与TCP/IP协议体系
    本文详细探讨了OSI七层模型(Open System Interconnection,开放系统互连)及其与TCP/IP协议体系的关系。OSI模型将网络通信过程划分为七个层次,每个层次负责不同的功能,从物理层到应用层逐步实现数据传输和处理。通过对比分析,本文揭示了OSI模型与TCP/IP协议在结构和功能上的异同,为理解现代网络通信提供了全面的视角。 ... [详细]
  • 西北工业大学作为陕西省三所985和211高校之一,虽然在农业和林业领域不如某些顶尖院校,但在航空航天领域的实力尤为突出。该校的计算机科学专业在科研和教学方面也具有显著优势,是考研的理想选择。 ... [详细]
  • 本文深入探讨了IO复用技术的原理与实现,重点分析了其在解决C10K问题中的关键作用。IO复用技术允许单个进程同时管理多个IO对象,如文件、套接字和管道等,通过系统调用如`select`、`poll`和`epoll`,高效地处理大量并发连接。文章详细介绍了这些技术的工作机制,并结合实际案例,展示了它们在高并发场景下的应用效果。 ... [详细]
  • 深入解析Wget CVE-2016-4971漏洞的利用方法与安全防范措施
    ### 摘要Wget 是一个广泛使用的命令行工具,用于从 Web 服务器下载文件。CVE-2016-4971 漏洞涉及 Wget 在处理特定 HTTP 响应头时的缺陷,可能导致远程代码执行。本文详细分析了该漏洞的成因、利用方法以及相应的安全防范措施,包括更新 Wget 版本、配置防火墙规则和使用安全的 HTTP 头。通过这些措施,可以有效防止潜在的安全威胁。 ... [详细]
author-avatar
mobiledu2502916347
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有