专栏首页ccf19881030的博客在Visual Studio2013中编译使用libcurl库

在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。下载后解压到某个目录下,对应的文件目录结构如下图所示:

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】并打开,如下图所示:

我在自己的Windows10系统下同时安装了Visual Studio 2017和Visual Studio 2013。 打开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文件夹,用于存放编译生成的文件。 如下图所示:

上面的目录,以编译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-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

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

3、在Visual Studio 2013中使用libcurl库

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

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

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

(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;
}

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

  • 添加libcurl的头文件所在目录 选择【C/C++】->【常规】->【附加包含目录】,在【附加包含目录】中添加libcurl所在的头文件路径,我的是:D:\env_build\libcurl_vs2013_x86\include 如下图所示:
  • 添加libcurl的debug动态库目录 依次选择【Debug属性页】->【链接器】->【常规】,在附加库目录中添加刚才编译好的lib库所在目录,如D:\env_build\libcurl_vs2013_x86\lib\x86\debug目录,如下图所示:

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

当然我使用的debug x86模式的程序,release的x86也类似,x64的也是,加上对应的头文件和库文件即可。 头文件加入后,相关的红色错误消失了,如下图所示:

3、运行libcurlDemo1程序

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

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

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

4、使用属性表文件

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

右键单击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开发环境,本人亲测好使。

(2)、build-libcurl-ios

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • matlab中的曲线拟合与插值

    曲线拟合与插值 在大量的应用领域中,人们经常面临用一个解析函数描述数据(通常是测量值)的任务。对这个问题有两种方法。在插值法里,数据假定是正确的,要求以某种方法...

    ccf19881030
  • Windows7下移植Qt4.8.4项目到QT5.2上时遇到的一些问题

        最近在Windows7下将Qt4.8.4+MSVC2008的项目移植到QT5.2下时,遇到了一些小问题:

    ccf19881030
  • Java 之数据类型

    基本类型与引用类型的区别: 1.基本类型与引用类型的组成 基本类型是一个单纯的数据类型,它表示的是一个具体的数字、字符或一个布尔值,例如100、'M'和tr...

    ccf19881030
  • SAS-编程中的小技巧(六)

    前段时间有人问小编,批量执行ods输出文件时,总是弹出并打开输出的文件,有没有办法关闭呢?你是否也遇到这样的问题,而找遍ods相关的Option仍无法解决呢?解...

    Setup
  • 数据结构之Trie树

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/articl...

    大黄大黄大黄
  • 趋势 | JavaScript 要取代 Java 了?

    对于从未写过一行代码的人们来说,Java 编程语言可能学起来非常艰难。而为了让学生们更好轻松地学习编程,斯坦福大学认为应该采取一些极端的措施。在该校最近更新的《...

    疯狂的技术宅
  • 【多进程】php多进程编程

    php实现多进程需要安装pcntl模块,这个模块是php官方提供的,所以我们可以在PHP源码中找到,下载 php7.3.7 源码并解压到 /home 目录下,...

    码缘
  • 2016年,数据、分析和机器学习趋势五大预测

    问题导读 1.你是如何预测大数据行业的? 2.本文是如何预测的? 3.你认为该如何根据行业来计划自己的2016? ? 第一个预测是数据和分析将以惊人...

    用户1410343
  • 【程序猿水贴】风是如何形成的 | 大气运动的原因

    最近看新闻偶然和老爸聊到最新的疫情,老爸随口说这病毒会被风刮到对面的M国去,我反驳说这是病毒又不是细菌。后来老爸又说形成风的原因是地球自转,我笑到说怎么可能,风...

    浩Coding
  • C++ 从文件读取python numpy 数组

    作为示例,我们先在python中创建一个二维的numpy数组, 并写入二进制文件:

    用户6021899

扫码关注云+社区

领取腾讯云代金券