zoukankan      html  css  js  c++  java
  • libcurl-7.54.1附加zlib1.2.11的编译

      手上有个小程序需要通过HTTP协议通信,选择了出名的libcurl作为支持库。由于网上的教程多是命令行编译,本人记性不好,比较讨厌记住一堆命令,因此折腾了一天通过VS对libcurl和zlib进行了编译。下面就将编译过程记录下作为备忘。
      一、环境及库版本介绍
      win10 64位、VS_professional_2013_with_update_5、curl-7.54.1、zlib-1.2.11
      二、目的
      生成libcurl静态库,并支持在xp下使用
      三、开始
        1、编译zlib
        从http://www.zlib.net/下载zlib-1.2.11并解压;进入目录zlib-1.2.11contribvstudiovc12打开工程,选择zlibstat项目,设置属性->releasewithoutasm->常规->平台工具集->Visual Studio 2013 - Windows XP (v120_xp),字符集本人项目全是unicode,因此这个地方也设置为unicode。如果选择release编译的话需要先编译asm代码,可以参考之前我写的zlib教程(1、lib-1.2.8的编译 从http://www.zlib.net/下载zlib-1.2.8.tar.gz,解压到目录zlib-1.2.8; 用vs2008命令行进入zlib-1.2.8contribmasmx86目录,执行bld_ml32.bat; 进入目录zlib-1.2.8contribvstudio,编译 4、静态链接库zlibstat.lib使用 引入头文件zlib.h,加入 #pragma comment(lib, "zlibstat.lib"),在使用时提示 error LNK2019: 无法解析的外部符号 _inflateEnd,error LNK2019: 无法解析的外部符号 _inflate,等时让人很郁闷,研究多时才发现需要在引入头文件zlib.h前加上#define ZLIB_WINAPI,大爷的。)zlib静态链接库的使用只需要2个头文件,zconf.h和zlib.h
        2、编译libcurl
        从https://curl.haxx.se/libcurl/下载libcurl-7.54.1并解压,进入目录curl-7.54.1projectsWindowsVC12打开工程,选择libcurl项目,通过配置管理器新建配置,为了通俗易懂,我起名LIB Release - DLL WIN SSPI - DLL WinIDN - lib zlib以LIB Release - DLL Windows SSPI - DLL WinIDN为模板,加入sspi可以支持https,winidn的作用我还不知道。
        选择libcurl项目,设置属性->LIB Release - DLL WIN SSPI - DLL WinIDN - lib zlib->常规->平台工具集->Visual Studio 2013 - Windows XP (v120_xp),字符集unicode。C/C++->预处理器->预处理器定义增加HAVE_ZLIB_H;HAVE_LIBZ;ZLIB_WINAPI。C/C++->常规->附加包含目录 增加zlib.h和zconf.h所在目录(建议把上步生成的lib、zlib.h和zconf.h文件拷贝到一个专用的文件夹里面)库管理器->常规 设置附加库目录和附加依赖项zlibstat.lib(上步生成的lib文件名)。
        编译,这时会出现libcurl.res : fatal error LNK1241: 已指定资源文件 zlibstat.lib(zlib.res)错误,原因是libcurl项目和zlib项目都添加了资源version,解决办法就是在上步编译zlib时打开解决方案资源管理器把zlib.rc移除再编译。再次编译libcurl,搞定
      四、libcurl的使用
      引入头文件,加入CURL_STATICLIB宏
      #pragma comment(lib,"ws2_32.lib")
      #pragma comment(lib,"wldap32.lib")
      #pragma comment(lib,"Crypt32.lib")
      #pragma comment(lib,"Normaliz.lib")
      #pragma comment(lib,"libcurl.lib")

           至于编译时该用md mt mdd mtd 请自行统一即可
      网上教程一大堆,我这里只记录些资料比较少的内容。
      有的网页在传输时不管客户端是否支持压缩都是经过压缩传输的,直接从web获取网页的源代码后,得到的是压缩后代码,我们可以自己解码,也可以让libcurl来自动完成,上述所写加入zlib就是为了可以自动解码。
      通过curl_easy_setopt(curl_, CURLOPT_ACCEPT_ENCODING, "gzip");可以完成自动解码。除了gzip还有其他编码方式,本人记性实在不好,记不住别的都有啥。
      libcurl的使用最简单的步骤(下面开始抄袭别人总结的内容,在此谢谢原作者):
      CURL* curl=curl_easy_init();
      curl_easy_setopt(curl, CURLOPT_URL, "http://www.baidu.com");
      curl_easy_perform(curl);
      curl_easy_cleanup(curl);
      curl_global_cleanup();
      关于多线程,应该在程序最开始的地方 curl_global_init, 然后再创建各个线程,在各个线程中用 curl_easy_init来创建curl 的 handle,然后针对这个handle用 curl_easy_setopt(handle, xxx, xxx) 设置传输相关的各种参数,最后用 cur_easy_perform(handle)来执行动作,传输结束后,最后调用 curl_easy_cleanup(handle) 来释放,然后结束线程在程序的主线程中,等所有线程都结束后,在程序退出前,调用 curl_global_cleanup来结束 libcurl. 

  • 相关阅读:
    HDFS升级域:Upgrade Domain
    HDFS升级域:Upgrade Domain
    HDFS数据快速拷贝方案:FastCopy
    HDFS数据快速拷贝方案:FastCopy
    Confluence 6 SQL Server 测试你的数据库连接
    Confluence 6 SQL Server 输入你的数据库细节
    Confluence 6 SQL Server 创建一个数据库和数据库用户
    Confluence 6 安装 SQL Server
    Confluence 6 Microsoft SQL Server 设置准备
    Confluence 6 Oracle 连接问题解决
  • 原文地址:https://www.cnblogs.com/gushandujian/p/7267341.html
Copyright © 2011-2022 走看看