想学习使用curl。想自己编译。结果。。。。
curl github库地址:https://github.com/curl/curl
官网下载地址 :http://curl.haxx.se/
1.此处使用github库地址,拉取代码
拉去后,等下,先下载cmake
cmake下载地址:https://cmake.org/download/
下载之后安装,安装后使用
将url路径填到上面
新建一个build填到下面
填好后,点击configure
选vs版本
选位数
选好之后选finish,就开始运行了,就开始编译了
等待结束之后,再点一下generate。
在build中找到sln。运行。生成ALLbuild。
就能看到release或debug中的生成的库了
到此cmake编译成功。
2.还有简单的安装curl的库的方法
使用vcpkg安装。首先安装vcpkg
1、打开Git CMD命令行工具,使用 cd 到建立的目标路径(如:C:\src);
2、输入命令:git clone https://github.com/Microsoft/vcpkg ,将开启vcpkg下载;
3、下载完成后,会自动建立一个vcpkg文件夹,就需要再次使用 cd 命令到vcpkg文件路径内;
4、运行 .\bootstrap-vcpkg.bat 等待运行完成。至此vcpkg安装完成。
5、Visual Studio与链接:
为了在Visual Studio中使用vcpkg,只需要进行一下操作,在之后的使用中就可以直接使用了(需要开启管理员权限),在完成以上操作的前提下,运行命令: .\vcpkg integrate install。运行结果如下,即链接成功,系统里所有C++编辑器都能与vcpkg建立链接了。
提示需要cmake,这个在之后安装库时会自动下载安装。
6、C\C++库的安装:
运行命令: .\vcpkg install [packages to install] 。
每次安装时,打开Git CMD后只需要cd到vcpkg的安装目录即可(如:C:\src\vcpkg)。使用 vcpkg help 或者 vcpkg help[comment] 可以获取特定命令的命令帮助,通过。.\vcpkg search [search term] 。
注意: vcpkg默认安装编译的是 X86 ,可以通过命令指定为 X64 ,例如:
.\vcpkg install zlib:x64-windows
.\vcpkg install zlib openssl --triplet x64-windows
安装完vcpkg之后,设置系统变量
D:\work1\vcpkg\vcpkg 添加到PATH中
然后就可以用
\vcpkg install curl下载 curl
会下载到D:\work1\vcpkg\vcpkg 中的installed\x86-windows中
lib include bin中会有你想要的。东西
3.使用。使用的是vcpkg下载的curl
直接#include <curl/curl.h> 就能用了。
/*
* @ libcurl使用示例
* @ 2014.04.29
* @ g++ -o LibCurlFunc LibCurlFunc.cpp -lcurl
*/
#include <iostream>
#include <string.h>
#include <curl/curl.h>
using namespace std;
/*
Http请求结束的回调函数
@ 会被调用多次,有下载到数据(http文件)就回调,直到下载完
*/
static size_t WriteFunction(void* input, size_t uSize, size_t uCount, void* avg)
{
/* cout << "[WriteFunction]:" << endl
<< "input=" << (char*)input << endl
<< "elementSize=" << uSize << endl
<< "elementCount=" << uCount << endl;*/
// 将请求返回数据input拷贝到avg中(avg为一开始curl_easy_setopt设置的参)
size_t uLen = uSize * uCount;
// string &sBuffer = *reinterpret_cast<string *>(avg);
// sBuffer.append(reinterpret_cast<const char *>(input), uLen);
string* pStr = (string*)(avg);
pStr->append((char*)(input), uLen);
// 只有返回uSize*uCount才会返回成功
return uLen;
}
int main()
{
CURL* pCurl = NULL;
CURLcode code;
/* CURLcode curl_global_init(long flags)
@ 初始化libcurl,全局只需调一次
@ flags: CURL_GLOBAL_DEFAULT // 等同于CURL_GLOBAL_ALL
CURL_GLOBAL_ALL // 初始化所有的可能的调用
CURL_GLOBAL_SSL // 初始化支持安全套接字层
CURL_GLOBAL_WIN32 // 初始化win32套接字库
CURL_GLOBAL_NOTHING // 没有额外的初始化
......
*/
code = curl_global_init(CURL_GLOBAL_DEFAULT);
if (code != CURLE_OK) {
cout << "curl_global_init() Err" << endl;
return -1;
}
/* CURL *curl_easy_init()
@ 初始化curl生成CURL *curl指针
*/
pCurl = curl_easy_init();
if (pCurl == NULL) {
cout << "curl_easy_init() Err" << endl;
return -1;
}
string sUrl = "www.baidu.com";
curl_slist* pHeaders = NULL;
string sBuffer;
/* struct curl_slist *curl_slist_append(struct curl_slist * list, const char * string);
@ 添加Http消息头
@ 属性string:形式为name+": "+contents
*/
string header = "Accept: Agent-007";
pHeaders = curl_slist_append(pHeaders, header.c_str());
/* CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter);
@ 设置下载属性及常用参数
*/
curl_easy_setopt(pCurl, CURLOPT_URL, "www.baidu.com"); // 访问的URL
curl_easy_setopt(pCurl, CURLOPT_HTTPHEADER, pHeaders); // 属性头部(要不pHeader就没用了)
curl_easy_setopt(pCurl, CURLOPT_TIMEOUT, 20); // 超时(单位S)
curl_easy_setopt(pCurl, CURLOPT_HEADER, 1); // 下载数据包括HTTP头部
curl_easy_setopt(pCurl, CURLOPT_WRITEFUNCTION, &WriteFunction); // !数据回调函数
curl_easy_setopt(pCurl, CURLOPT_WRITEDATA, &sBuffer); // !数据回调函数的参,一般为Buffer或文件fd
/* CURLcode curl_easy_perform(CURL *handle);
@ 开始下载
*/
code = curl_easy_perform(pCurl);
if (code != CURLE_OK) {
cout << "curl_easy_perform() Err" << endl;
return -1;
}
/* CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ... );
@ 获取下载完的相关信息
@ info:CURLINFO_RESPONSE_CODE // 获取返回的Http码
CURLINFO_TOTAL_TIME // 获取总的请求下载时间
CURLINFO_SIZE_DOWNLOAD // 获取下载的文件大小
......
*/
long retCode = 0;
code = curl_easy_getinfo(pCurl, CURLINFO_RESPONSE_CODE, &retCode);
if (code != CURLE_OK) {
cout << "curl_easy_perform() Err" << endl;
return -1;
}
cout << "[Http Return Code] : " << retCode << endl;
cout << "[Http Context] : " << endl << sBuffer << endl;
/* void curl_easy_cleanup(CURL * handle);
@ 释放CURL *curl指针
*/
curl_easy_cleanup(pCurl);
/* void curl_global_cleanup(void);
@ 初始化libcurl,全局也只需调一次
*/
curl_global_cleanup();
}