热门标签 | 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;分享真的是一件很快乐的事。

 



 


推荐阅读
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 【技术分享】一个 ELF 蠕虫分析
    【技术分享】一个 ELF 蠕虫分析 ... [详细]
  • centos php部署到nginx 404_NodeJS项目部署到阿里云ECS服务器全程详解
    本文转载自:http:www.kovli.com20170919ecs-deploy作者:Kovli本文详细介绍如何部署NodeJS项目到阿里云ECS上, ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • 现在比较流行使用静态网站生成器来搭建网站,博客产品着陆页微信转发页面等。但每次都需要对服务器进行配置,也是一个重复但繁琐的工作。使用DockerWeb,只需5分钟就能搭建一个基于D ... [详细]
  • centos6.8 下nginx1.10 安装 ... [详细]
  • 基于SSL的mysql服务器的主从架构实现说明:本文选用172.16.22.1作为主服务器,172.16.22.3作为从服务器从服务器的mysql软件版 ... [详细]
  • elixirerlang通过AyandaDubeFIPS(联邦信息处理标准)[1]是由NIST(美国国家标准技术研究院)定义 ... [详细]
  • linux clickhouse安装在指定目录_Centos8服务器指定目录安装配置Nginx
    1.安装前准备(1)检查是否安装过nginx(如果没有安装过可以无视)find-namenginx搜索nginx文件及其文件夹rm-rf【nginx配置地址文件及其文件夹】手动删除 ... [详细]
  • FTP服务ftp的报错及用户管理
    ftp服务常见报错530报错认证失败(密码错误或者服务端拒绝)550服务本身未开启553文件系统不可写(权限问题)500服 ... [详细]
  • 【教程】SecureCRT8.5安装和注册的详细步骤及操作指南
    00.目录文章目录00.目录01.SecureCRT8.5介绍02.SecureCRT8.5的特性03.SecureCRT8.5的特点04.SecureCRT8.5安装05.Sec ... [详细]
  • 用lvm+vmware+kickstart实现系统自动安装和快照安装
    由于我的机子是32位,装不了64位系统,所以无法使用kvm,只能用vmware了,可是vmware安装使用自带的autoinst.iso实现自动安装,无法实现我的需求,经过研究我使用kic ... [详细]
  • PHP程序员玩转Linux系列 搭建FTP代码开发环境
    PHP程序员玩转Linux系列搭建FTP代码开发环境-PHP程序员玩转Linux系列文章:有些同学可能觉得我写的都是啥yum安装的,随便配置一下而已,没啥技术含量,我的目的是让大家 ... [详细]
  • Centos 6/7安装Python 3.5及SSL编译安装,实现HTTPS识别
    Python3中无法导入ssl模块的解决办法如果你发现在python3脚本运行过程中发现涉及到ssl模块都无法运行的情况下。那么需要进行如下步骤第一步:yuminst ... [详细]
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社区 版权所有