在Visual Studio2013中编译使用libcurl库

关于libcurl库

libcurl是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传, HTTP基本表单上传,代理,cookies,和用户认证。想要知道更多关于libcurl的介绍,可以到官网 http://curl.haxx.se/上去了解,在这里不再详述。本文主要介绍如何在Visual Studio 2013开发环境中编译并使用libcurl库。

1、下载libcurl源代码

libcurl最新源代码下载地址为:https://curl.haxx.se/download/curl-7.67.0.zip,对应的下载页面为:https://curl.haxx.se/download.html。下载后解压到某个目录下,对应的文件目录结构如下图所示:

libcurl库的源代码目录结构

2、使用Visual Studio 2013编译libcurl源代码

在自己的Windows系统上安装好Visual Sutido 2013之后,并且下载好libcurl的最新源代码后,就可以开始在Visual Studio 2013中编译libcurl的源代码了,笔者写这篇文章时libcurl的最新版本是7.67.0,使用的是Windows10系统。
libcurl源代码目录下winbuild文件夹下的BUILD.WINDOWS.txt详细描述了如何使用Visual C++编译工具编译、构建和安装curl以及libcurl的源代码,我使用的是Visual Studio 2013。
首先在Window10系统最左侧的Windows菜单找到Visual Studio 2013下的【Visual Studio Tools】并打开,如下图所示:


Visual Studio Tools

我在自己的Windows10系统下同时安装了Visual Studio 2017和Visual Studio 2013。
打开Visual Studio Tools,可以看到对应的快捷键,如下图所示:


Visual Studio Tools命令快捷键

为了使用Visual Studio 2013编译出X86环境的libcurl库,我使用的是:VS2013 x86 本机工具命令提示,当然如果想编译成X64的库,可以选择VS2013 x64 本机工具命令提示或者VS2013 x64 兼容工具命令提示。
打开VS2013 x86 本机工具命令提示的快捷方式,进入libcurl源代码的目录,例如我的curl源代码目录放E:\SoftDevelop\CPlus\VCProject2013\curl-7.67.0下,则输入如下命令进入到该目录
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC>E:

E:\>cd E:\SoftDevelop\CPlus\VCProject2013\curl-7.67.0

E:\SoftDevelop\CPlus\VCProject2013\curl-7.67.0>cd winbuild

E:\SoftDevelop\CPlus\VCProject2013\curl-7.67.0\winbuild>
命令行

关于使用VS2013 x86本机工具命令提示编译libcurl源代码,采用的是VC的nmake命令,相当于Windows下的make工具。
官网文件如下:

Building with Visual C++
========================

Open a Visual Studio Command prompt:

     Using the 'Developer Command Prompt for VS <version>' menu entry:
       where version is the Visual Studio version. The developer prompt at default
       uses the x86 mode. It is required to call Vcvarsall.bat to setup the prompt
       for the machine type you want, using Vcvarsall.bat.
       This type of command prompt may not exist in all Visual Studio versions.

       For more information, check:
         https://docs.microsoft.com/en-us/dotnet/framework/tools/developer-command-prompt-for-vs
         https://docs.microsoft.com/en-us/cpp/build/how-to-enable-a-64-bit-visual-cpp-toolset-on-the-command-line

     Using the 'VS <version> <platform> <type> Command Prompt' menu entry:
       where version is the Visual Studio version, platform is e.g. x64
       and type Native of Cross platform build.  This type of command prompt
       may not exist in all Visual Studio versions.

       See also:
         https://msdn.microsoft.com/en-us/library/f2ccy3wt.aspx

Once you are in the console, go to the winbuild directory in the Curl
sources:
    cd curl-src\winbuild

Then you can call nmake /f Makefile.vc with the desired options (see below).
The builds will be in the top src directory, builds\ directory, in
a directory named using the options given to the nmake call.

nmake /f Makefile.vc mode=<static or dll> <options>

where <options> is one or many of:
  VC=<6,7,8,9,10,11,12,14,15>    - VC versions
  WITH_DEVEL=<path>              - Paths for the development files (SSL, zlib, etc.)
                                   Defaults to sibbling directory deps: ../deps
                                   Libraries can be fetched at https://windows.php.net/downloads/php-sdk/deps/
                                   Uncompress them into the deps folder.
  WITH_SSL=<dll or static>       - Enable OpenSSL support, DLL or static
  WITH_NGHTTP2=<dll or static>   - Enable HTTP/2 support, DLL or static
  WITH_MBEDTLS=<dll or static>   - Enable mbedTLS support, DLL or static
  WITH_CARES=<dll or static>     - Enable c-ares support, DLL or static
  WITH_ZLIB=<dll or static>      - Enable zlib support, DLL or static
  WITH_SSH2=<dll or static>      - Enable libSSH2 support, DLL or static
  WITH_PREFIX=<dir>              - Where to install the build
  ENABLE_SSPI=<yes or no>        - Enable SSPI support, defaults to yes
  ENABLE_IPV6=<yes or no>        - Enable IPv6, defaults to yes
  ENABLE_IDN=<yes or no>         - Enable use of Windows IDN APIs, defaults to yes
                                   Requires Windows Vista or later
  ENABLE_WINSSL=<yes or no>      - Enable native Windows SSL support, defaults to yes
  GEN_PDB=<yes or no>            - Generate Program Database (debug symbols for release build)
  DEBUG=<yes or no>              - Debug builds
  MACHINE=<x86 or x64>           - Target architecture (default is x86)
  CARES_PATH=<path to cares>     - Custom path for c-ares
  MBEDTLS_PATH=<path to mbedTLS> - Custom path for mbedTLS
  NGHTTP2_PATH=<path to HTTP/2>  - Custom path for nghttp2
  SSH2_PATH=<path to libSSH2>    - Custom path for libSSH2
  SSL_PATH=<path to OpenSSL>     - Custom path for OpenSSL
  ZLIB_PATH=<path to zlib>       - Custom path for zlib

上面的文档中,可以使用DEBUG=yes编译Debug版本的库,默认是Release版本的;
MACHINE=x64可以编译生成x64的库,默认是x86的。

  • 1、 使用VS2013编译libcurl的debug版的static静态库 libcurl-vc-x86-debug-static-ipv6-sspi-winssl
    对应的命令为:nmake /f Makefile.vc mode=static DEBUG=yes
E:\SoftDevelop\CPlus\VCProject2013\curl-7.67.0\winbuild>nmake /f Makefile.vc mode=static DEBUG=yes
  • 2、使用VS2013编译libcurl的debug本的dll动态库 libcurl-vc-x86-debug-dll-ipv6-sspi-winssl
  • 对应的命令为:nmake /f Makefile.vc mode=dll DEBUG=yes
E:\SoftDevelop\CPlus\VCProject2013\curl-7.67.0\winbuild>nmake /f Makefile.vc mode=dll DEBUG=yes
  • 3、使用VS2013编译libcurl的release版的x86的static静态库 libcurl-vc-x86-release-static-ipv6-sspi-winssl
    命令为:nmake /f Makefile.vc mode=static
E:\SoftDevelop\CPlus\VCProject2013\curl-7.67.0\winbuild>nmake /f Makefile.vc mode=static

Microsoft (R) 程序维护实用工具 12.00.21005.1 版
版权所有 (C) Microsoft Corporation。  保留所有权利。

configuration name: libcurl-vc-x86-release-static-ipv6-sspi-winssl
        cl /O2 /DNDEBUG /MD /DCURL_STATICLIB /I. /I ../lib /I../include /nologo /W4 /wd4127 /EHsc /DWIN32 /FD /c /DBUILDING_LIBCURL  /DUSE_WIN32_IDN /DWANT_IDN_PROTOTYPES  /DUSE_IPV6  /DUSE_WINDOWS_SSPI /DUSE_SCHANNEL /Fo"..\builds\libcurl-vc-x86-release-static-ipv6-sspi-winssl-obj-lib/file.obj"  ..\lib\file.c
file.c
  • 4、使用VS2013编译libcurl的release的dll动态库 libcurl-vc-x86-release-dll-ipv6-sspi-winssl
    对应的命令为:nmake /f Makefile.vc mode=dll
 E:\SoftDevelop\CPlus\VCProject2013\curl-7.67.0\winbuild>nmake /f Makefile.vc mode=dll

默认会在源代码的顶层目录下创建builds文件夹,用于存放编译生成的文件。
如下图所示:


builds文件夹

上面的目录,以编译debug版本的dll库为例,最后为在curl源代码所在目录的builds下生成libcurl-vc-x86-debug-dll-ipv6-sspi-winssl文件夹,它是编译最终头文件、库文件、可执行程序所在目录,include是curl库的头文件存放目录;lib库是库文件所在目录,里面有libcurl_debug.lib文件;bin目录是生成的curl.exe可执行文件和libcurl_debug.dll的dll文件所在目录,如下图所示:


libcurl-vc-x86-debug-dll-ipv6-sspi-winssl

而libcurl-vc-x86-debug-dll-ipv6-sspi-winssl-obj-curl和libcurl-vc-x86-debug-dll-ipv6-sspi-winssl-obj-lib只是一些编译生成的中间文件。
我们需要的就是libcurl-vc-x86-debug-dll-ipv6-sspi-winssl文件夹中的头文件、库文件以及dll库。可以根据需要选择自己所需的版本。
这里我选择libcurl-vc-x86-debug-dll-ipv6-sspi-winssl以及libcurl-vc-x86-release-dll-ipv6-sspi-winssl文件夹中的库,即使用debug和release版的dll动态库,稍作整理,形成如下的目录结构:
卷 Data 的文件夹 PATH 列表
卷序列号为 3EE8-BA3A
D:.
│  tree.txt
│  
├─bin
│      curl.exe
│      libcurl.dll
│      libcurl_debug.dll
│      
├─include
│  └─curl
│          curl.h
│          curlver.h
│          easy.h
│          mprintf.h
│          multi.h
│          stdcheaders.h
│          system.h
│          typecheck-gcc.h
│          urlapi.h
│          
└─lib
    └─x86
        ├─debug
        │      libcurl_debug.lib
        │      
        └─release
                libcurl.lib
libcurl_vs2013_x86

为了方便,我一般把一些第三方库放在系统的某个固定目录,如D:\env_build目录,我把编译后的libcurl的debug和release版的x86动态库以及头文件存放在libcurl_vs2013_x86目录下。

3、在Visual Studio 2013中使用libcurl库

(1)、创建一个Win32 VC++控制台的空项目

打开Visual Studio 2013开发工具,创建一个基于Win32 VC++的控制台的空项目,取名为libcurlDemo1,并选好程序存放的路径,我的存放路径为,如下图所示:


使用VS2013新建一个Win32控制台的项目

12

13

至此在Visual Studio 2013中生成了一个VC++控制台的空项目,如下图所示:


14

(2)添加项目代码以及libcurl的头文件和依赖库

在Visual Stuido 2013中新增一个main.cpp源代码文件,
main.cpp只是一个使用libcurl库的示例程序,更多的示例可以参考libcurl官网:https://curl.haxx.se/libcurl/c/example.html或者Githubhttps://github.com/curl/curl/tree/master/docs/examples
// main.cpp

#include <stdio.h>
#include <curl/curl.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    CURL *curl;             //定义CURL类型的指针
    CURLcode res;           //定义CURLcode类型的变量,保存返回状态码
    
    char url[] = "www.baidu.com";
    curl = curl_easy_init();        //初始化一个CURL类型的指针
    if (curl != NULL)
    {
        //设置curl选项. 其中CURLOPT_URL是让用户指 定url. url中存放的是网址
        curl_easy_setopt(curl, CURLOPT_URL, url);
        //调用curl_easy_perform 执行我们的设置.并进行相关的操作. 在这 里只在屏幕上显示出来.
        res = curl_easy_perform(curl);
        //清除curl操作.
        curl_easy_cleanup(curl);
    }

    return 0;
}
15

从上图可以看到在没有导入libcurl库的头文件时VS2013会提示红色的错误。
下面在VS2013中加入我们刚才编译好的libcurl库
在VS2013左下角的【属性管理器】->【Debug|Win32】,右键单击【Debug|Win32】,选择【属性】,进入到【Debug属性页对话框】,如下图所示:


16

17
  • 添加libcurl的头文件所在目录
    选择【C/C++】->【常规】->【附加包含目录】,在【附加包含目录】中添加libcurl所在的头文件路径,我的是:D:\env_build\libcurl_vs2013_x86\include
    如下图所示:


    18
  • 添加libcurl的debug动态库目录
    依次选择【Debug属性页】->【链接器】->【常规】,在附加库目录中添加刚才编译好的lib库所在目录,如D:\env_build\libcurl_vs2013_x86\lib\x86\debug目录,如下图所示:
19

20

选择【Debug属性页】->【链接器】->【输入】->【附加依赖项】中,加入D:\env_build\libcurl_vs2013_x86\lib\x86\debug目录下的libcurl_debug.lib文件名,如下图所示:


21

当然我使用的debug x86模式的程序,release的x86也类似,x64的也是,加上对应的头文件和库文件即可。

头文件加入后,相关的红色错误消失了,如下图所示:


22

3、运行libcurlDemo1程序

添加好libcurl库的头文件和动态库后,运行程序,发现出现如下的错误:

23

说是找不到libcurl_debug.dll动态库文件,我们可以将刚才编译生成D:\env_build\libcurl_vs2013_x86\bin目录下的libcurl_debug.dll文件拷贝到libcurlDemo1项目生成的可执行程序libcurlDemo1.exe所在目录,入下图所示:
24

26

然后再次运行libcurlDemo1程序,可以看到控制台中输出了从www.baidu.com页面获取的html页面,如下图所示:
26

4、使用属性表文件

有时候为了避免为每个项目都添加头文件和lib依赖库文件,可以使用为某个第三方依赖库比如libcurl创建对应的属性表文件,以props为后缀,
在刚才的VS2013的libcurlDemo1项目中,针对debug的x86项目,创建一个libcurl_debug_x86_vs2013.props的属性表文件,选择【属性页管理器】->【Debug|Win32】,右键单击,【添加新项目属性表】,在【添加新项】对话框中输入属性表名称,如下图所示:


27

右键单击libcurl_debug_x86_vs2013.props的属性表文件,选择【属性】菜单,在libcurl_debug_x86_vs2013.props属性页的对话框中添加libcurl的头文件和lib库文件,同上。

5、相关资料

(1)build-libcurl-windows

github上面有一个项目build-libcurl-windows,Batch script to download and build libcurl (using Visual Studio compiler),即使用build.bat脚本下载libcurl源代码并编译,前提是在Windows系统下安装了Visual Studio开发环境,本人亲测好使。

28

(2)、build-libcurl-ios

github上面有一个项目build-libcurl-ios,是针对ios环境下的libcurl的编译。

(3)、C++ 用libcurl库进行http通讯网络编程

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,230评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,261评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,089评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,542评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,542评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,544评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,922评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,578评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,816评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,576评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,658评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,359评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,920评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,859评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,381评论 2 342