zoukankan      html  css  js  c++  java
  • libcurl开源库在Win7 + VS2012环境下编译、配置详解 以及下载文件并显示下载进度 demo(转载)

    转载:http://blog.csdn.net/fengshuiyue/article/details/39530093(基本教程)

    转载:https://my.oschina.net/u/1420791/blog/198247

    转载:http://www.cnblogs.com/flylong0204/p/4723155.html

    转载:http://www.tuicool.com/articles/VNRzEbq

    转载:http://blog.csdn.net/hei_ya/article/details/51606799

    转载:http://blog.csdn.net/zengraoli/article/details/9189449

    转载:http://blog.csdn.net/sunnyleevip/article/details/41038559

    转载:http://blog.csdn.net/atceedsun/article/details/40581247

    转载:http://ysir.me/2015/08/26/Windows%E4%B8%8B%E7%BC%96%E8%AF%91%E5%B9%B6%E4%BD%BF%E7%94%A8libcurl-lib%E9%9D%99%E6%80%81%E5%BA%93/

    转载:http://blog.csdn.net/mtour/article/details/40375947 (下载文件显示进度条demo)

    转载:https://blog.csdn.net/kenkao/article/details/46875571(curl返回常见错误码)

    一 准备

    1.1 CURL官网下载地址:http://curl.haxx.se/download.html

    1.2 找到源码包,我这里下载的是7.32.0版:http://curl.haxx.se/download/curl-7.32.0.zip

    二 步骤

    2.1

    打开curl-7.32.0vsvc8libvc8libcurl.vcproj文件,VS会提示升级工程,下一步即可

    VC工程里有些设置问题导致不能直接编译,需要稍作修改

    2.2

    打开工程属性 > CC++ > 常规 > 附加包含目录。这里的包含目录是"..include",而这个目录根本就不存在,它应该指

    向"curl-7.32.0include"才对,所以把这里改成"......include"。(或者直接完整路径也可以)

     

    2.3打开工程属性 > CC++ > 预处理器 > 预处理器定义。这里有个默认宏"BUILDING_LIBCURL",把它改

    成"CURL_STATICLIB"。这样,那些接口函数就不会被声明为导出函数了。

     

    2.4打开工程属性 > CC++ > 库管理器 > 常规 > 附加依赖项。添加ws2_32.lib和wldap32.lib,这是CURL必须依赖的。




    2.5.把"libcurl.rc"从工程中移除,它只是版本信息,只会增大文件,去掉!(无所谓)


    2.6 可编译出如下版本,根据需要手动设置编译

    libcurld.lib //debug      Multi-threaded Debug (/MTd)

    因为默认生成的文件名为libcurl.dll ,所以为了让Debug和release有区别,我们在Librarian选中General,在output file 输入"$(OutDir)$(TargetName)d$(TargetExt)" ,中间多了一个字母d
     
    libcurl.dll  //release     Multi-threaded (/MT)



    //以上为静态库版本,生成exe体积大,包含库。

    生成两种版本的均可。但是连接使用的时候注意对应版本。


    libcurld.lib //debug     Multi-threaded DLL Debug (/MDD)
     
    libcurl.dll //release    Multi-threaded DLL (MD)

    //以上为动态库版本,生成exe体积小,不包含库。

    2.7 然后将其分别放入自己创建一个debug和一个release文件夹内、

        例如debug/libcurl.lib release//libcurl.lib
            debug/libcurl.dll release//libcurl.dll
     注意将其放入C:curl-7.32.0curl-7.32.0lib目录里面
    (可以自定义,只要注意后面库包含时的变量就可以了)

    2.8 创建两个环境变量 

    例如 CURL_INC设置为C:curl-7.32.0curl-7.32.0include
    例如 CURL_LIB设置为C:curl-7.32.0curl-7.32.0lib

    三 结果测试

    3.1 然后开始测试如何使用。
       
    为了测试lib文件,新建一个控制台程序,

    打开工程属性 > CC++ > 常规 >包含头文件$(CURL_INC)
    打开工程属性 > CC++ > 常规 >包含库文件$(CURL_LIB)debug
    (此处注意debug和release不同,以免影响后期工程调试)
    3.2 

    打开工程属性 > CC++ > 预处理器 > 预处理器定义。添加"CURL_STATICLIB"。

    这样,那些接口函数就不会被声明为导出函数了

    3.3 添加依赖库文件

    LibCurl编程介绍

    利用libcurl完成传输任务的流程:

    1.调用curl_global_init()初始化libcurl
    2.调用 curl_easy_init()函数得到 easy interface型指针
    3.调用curl_easy_setopt设置传输选项
    4.根据curl_easy_setopt设置的传输选项,实现回调函数以完成用户特定任务
    5.调用curl_easy_perform()函数完成传输任务
    6.调用curl_easy_cleanup()释放内存

    在控制台程序中使用libcurl库,http请求下载文件显示进度

    #include <stdio.h>
    
    #include "StdAfx.h"
     
    size_t my_write_func(void *ptr, size_t size, size_t nmemb, FILE *stream)
    {
      return fwrite(ptr, size, nmemb, stream);
    } 
     
    int my_progress_func(char *progress_data,
                         double t, /* dltotal */
                         double d, /* dlnow */
                         double ultotal,
                         double ulnow)
    {
      printf("%s %g / %g (%g %%)
    ", progress_data, d, t, d*100.0/t);
      return 0;
    }
     
    int main(int argc, char **argv)
    {
      CURL *curl;
      CURLcode res;
      FILE *outfile;
      char *url = "http://192.168.1.80:603/bic/download?userId=402832a95ad64661015ad6476b800024&fileName=dbpro.war";
      char *progress_data = "* ";
     
      curl = curl_easy_init();
      if(curl)
      {
        outfile = fopen("dbpro.war", "wb");
     
        curl_easy_setopt(curl, CURLOPT_URL, url);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, outfile);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_write_func);
        curl_easy_setopt(curl, CURLOPT_NOPROGRESS, FALSE);
        curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, my_progress_func);
        curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, progress_data);
     
        res = curl_easy_perform(curl);
     
        fclose(outfile);
        /* always cleanup */
        curl_easy_cleanup(curl);
      }
      return 0;
    }
  • 相关阅读:
    ES数据库重建索引——Reindex(数据迁移)
    ES数据库搜索
    Elasticsearch及相关插件的安装
    初识ES数据库
    Oracle数据库(二)
    Oracle数据库(一)
    DBUtils和连接池
    动态页面技术(EL/JSTL)
    Istio安装
    idea正则替换下划线为驼峰
  • 原文地址:https://www.cnblogs.com/chechen/p/6755569.html
Copyright © 2011-2022 走看看