手上有个小程序需要通过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.11\contrib\vstudio\vc12打开工程,选择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.8\contrib\masmx86目录,执行bld_ml32.bat;
进入目录zlib-1.2.8\contrib\vstudio,编译
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.1\projects\Windows\VC12打开工程,选择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.

libcurl-7.54.1附加zlib1.2.11的编译的更多相关文章

  1. zlib1.2.11静态编译

    1.进入官网http://zlib.net/,下载且解压zlib1211.zip: 2. 打开已解压的zlib-1.2.11目录,找到win32文件夹 3.将Makefile.msc复制到上一层,也就 ...

  2. linux下安装nginx(nginx(nginx-1.8.0.tar.gz),openssl(openssl-fips-2.0.9.tar.gz) ,zlib(zlib-1.2.11.tar.gz),pcre(pcre-8.39.tar.gz))

    :要按顺序安装: 1:先检查是否安装 gcc ,没有先安装:通过yum install gcc-c++完成安 2:openssl : tar -zxf  openssl-fips-2.0.9.tar. ...

  3. Valgrind 3.11.0编译安装

    Valgrind 3.11.0编译安装 Valgrind是一款用于内存调试.内存泄漏检测以及性能分析的软件开发工具. Valgrind遵守GNU通用公共许可证条款,是一款自由软件. 到3.3.0版本为 ...

  4. mingw zlib-1.2.11 win32-static.patch

    diff --git a/Makefile.in b/Makefile.in index 1852192..c88f5b5 100644 --- a/Makefile.in +++ b/Makefil ...

  5. hive0.11的编译/安装/配置

    一.获取hive 0.11文件 1.直接在apache网站下载release版 2.自己下载源码编译.方法: git clone https://github.com/amplab/hive.git ...

  6. gcc/g++ 如何支持c11 / c++11标准编译

    如果用命令 g++ -g -Wall main.cpp  编译以下代码 : /* file : main.cpp */ #include <stdio.h> int main() { in ...

  7. 【转】gcc/g++ 如何支持c11 / c++11标准编译

     如果用命令 g++ -g -Wall main.cpp  编译以下代码 : 1 2 3 4 5 6 7 8 9 10 11 12 /*     file : main.cpp */ #include ...

  8. gcc g++支持C++11 标准编译及其区别

    g++ -g -Wall -std=c++11 main.cpp gcc -g -Wall -std=c11 main.cpp 如果不想每次写这个-std=C++11这个选项该怎么办呢? 方法出处:h ...

  9. vscode Go 1.11.4 编译错误 need Delve built by Go 1.11 or later

    更新golang的版本为1.11.4之后vscode编译错误:executables built by Go 1.11 or later need Delve built by Go 1.11 or ...

随机推荐

  1. springboots 环境搭建

    1.创建demo文件 spring initializr : http://start.spring.io/ 2.gradle 下载 https://services.gradle.org/distr ...

  2. ELK 方案

    转自:https://blog.csdn.net/enweitech/article/details/81744250 今天临时收到一个企业客户的项目需求,需要对所有WIndows业务服务器的日志进行 ...

  3. 如何使用 Telegram

    Telegram是一款加密的实时通讯软件,本文告诉大家如何使用 这个软件. 在使用之前,需要保证自己已经开了梯子,如果没有梯子,那么就无法使用这个工具. 假如梯子是 127.0.0.1 端口 1080 ...

  4. Walkway.js – 创建简约的 SVG 线条动画

    Walkway.js 是一个使用线条和路径元素组成 SVG 动画图像的简单方法.只需根据提供的配置对象创建一个新的 Walkway 实例就可以了.这种效果特别适合那些崇尚简约设计风格的网页.目前, W ...

  5. Tomcat启动项目两次

    网上一搜,给出的答案都一样,不外乎:1.删除 Host 标签配置的 appBase="webapps"2.删除 Context 配置 此处这样做:重新添加Tomcat,选择好自己的 ...

  6. Docker(二):微服务教程

    Docker 是一个容器工具,提供虚拟环境.很多人认为,它改变了我们对软件的认识. 站在 Docker 的角度,软件就是容器的组合:业务逻辑容器.数据库容器.储存容器.队列容器......,Docke ...

  7. python中新式类和经典类

    python中的类分为新式类和经典类,具体有什么区别呢?简单的说, 1.新式类都从object继承,经典类不需要. Python 2.x中默认都是经典类,只有显式继承了object才是新式类 Pyth ...

  8. angular基于ui-router实现系统权限控制

    前端去实现权限控制听起来有点扯淡(实际也有点扯淡),掩耳盗铃,主要是担心安全问题,但是如果在前后端分离的情况下,需要做一个带有权限控制的后台管理系统,angular基于ui-router应该怎么做呢? ...

  9. 高级功能:很有用的javascript自定义事件

    之前写了篇文章<原生javascript实现类似jquery on方法的行为监听>比较浅显,能够简单的使用场景. 这里的自定义事件指的是区别javascript默认的与DOM交互的事件,比 ...

  10. html5 分组标签 br hr p div blockquote figure ul ol li pre

    <br>    换行, 单标签 <hr>    分割线,水平线 <p>    段落, 有<br>换行功能, 而且行距会比普通换行要宽. <div& ...