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

本教程开发平台: 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添加到系统环境变量中(这里请配置自己的安装路径 ),然后到控制台进行测试,成功如下图

image.png



NASM工具下载安装配置:

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

image.png



nmake配置检测:

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

image.png



下载编译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命令行工具:

image.png

在开始之前我们先阅读一下软件包下面的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中生成如下四个文件夹

image.png



下载编译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

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

image.png



下载编译libcurl:

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

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

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

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

image.png

所以我们需要新建目录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目录中

image.png

image.png

切换到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版本的库文件

image.png

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

image.png

image.png

image.png



测试:

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

image.png

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

image.png

image.png

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

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

image.png

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

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


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

#include <iostream>
#include <string>
#include <curl/curl.h>
#include <fstream>


using namespace std;

static size_t onWriteData(void *buffer, size_t size, size_t nmemb, void *lpVoid){
    string *str = dynamic_cast<string *>((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 =  curl_easy_init();
    string url = "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 = "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 = curl_easy_perform(curl);
    cout << "curlcode is " << res << endl;
    if(res != CURLE_OK){
        fprintf(stderr, "curl_easy_perform() failed: %s\n",
                      curl_easy_strerror(res));
    }
    curl_easy_cleanup(curl);


    return 0;
}

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

执行后的结果如图:

image.png

我们获取到的html文件如图

image.png

到这里就大功告成了。


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

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

 

写在最后的感受:

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


版权声明: 此文为本站源创文章[或由本站编辑从网络整理改编],
转载请备注出处:
[狂码一生] https://www.sindsun.com/articles/16/138
[若此文确切存在侵权,请联系本站管理员进行删除!]


--THE END--