关于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的编译。