1:linux下源码编译
注意:不需要其它功能就disable,不然会在连接时报错, 如果你没有disable掉,但你的机器上又没有安装相应的库,link时会报错。
2:windows下源码编译
libcurl 7.21以后的版本在Windows下的编译比较简单,自带了MinGW和VC环境的Makefile文件,首先去Curl官网下载源代码:http://curl.haxx.se/download.html,任选一个下载即可,推荐这个: curl-7.21.2.tar.gz,下载完成后解压开,打开命令行进入curl源码目录,(在此之前请先设置好MinGW的环境变量):
cd curl-7.21.2
编译libcurl库文件:
cd lib
make -f Makefile.m32
等待编译完成即可
(若需编译生成curl可执行文件,则执行:
cd ../src
make -f Makefile.m32)
编译完成后,我们需要复制include头文件和库文件到一个目录供程序开发用
1. 新建curllib目录
2. 新建curllib/include目录,将源代码include目录里的curl文件夹复制到curllib/include目录,这些是使用libcurl需要的头文件
3. 新建curllib/lib目录,将源代码lib目录里编译好的库文件libcurl.a,libcurldll.a,libcurl.dll复制到curllib目录
4. 将MinGW安装目录下lib文件夹里的libwldap32.a和libws2_32.a复制到curllib/lib目录
至此,curllib就是我们开发中要使用到的libcurl的全部文件,下面新建一个测试程序main.c:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "./curllib/include/curl.h"
size_t callback_write_file(void *ptr, size_t size, size_t nmemb, void *userp)
{
//fprintf(stdout,"size=%d\n",size);
fwrite(ptr,size,nmemb,(FILE *)userp);
return size * nmemb; //必须返回这个大小, 否则只回调一次, 不清楚为何.
}
void *func_download_file(FILE *fp)
{
CURL *curl = NULL;
CURLcode res;
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, "http://10.255.64.30:8082/20140225/vt/01B5CE3D7366577E5A85179BCAC742C9.8BB4DB74.8d8c8a829de211e3aae200266cf463ac"); //设置下载的URI
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 20); //设置超时
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); //屏蔽其它信号
//curl_easy_setopt(curl, CURLOPT_HEADERDATA, 1); //下载数据包
//curl_easy_setopt(curl, CURLOPT_RANGE, "0-500"); //用于断点续传, 设置下载的分片
//char buffer[MAXHEADLEN] = {0x0};
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback_write_file); //设置下载数据的回调函数
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
res = curl_easy_perform(curl);
if(res != CURLE_OK)
{
fprintf(stdout,"curl execute fail\n");
}
curl_easy_cleanup(curl);
curl_global_cleanup();
return 0;
}
int main()
{
FILE *fp = fopen("./kaka","wb");
if(!fp)
{
fprintf(stdout,"fopen fail \n");
}
func_download_file(fp);
fclose(fp);
return 0;
}
方法一、命令行编译使用licurl的程序
假设测试代码curltest.c位于e:/project
假设curllib文件夹的位置为c:/curllib
命令行运行下列命令编译这个测试程序:
cd e:/project
gcc -I. -Ic:/curllib/include -g -O2 -DCURL_STATICLIB -c main.c
gcc -o main.exemain.o -Lc:/curllib/lib -lcurl -lwldap32 -lws2_32
这时可以看到main.c目录下生成了一个main.exe文件
接着在命令行输入:
main.exe
方法二、Code::Blocks中使用libcurl静态库
1. 新建工程,在工程里添加代码同上的main.c文件
2. 将上面curllib/include目录下的curl文件夹复制到MinGW安装目录的include目录,或在工程目录下建立以目录存放include,然后打开Build Options选项,在Search directories选项卡下添加include目录
3. 工程名上右键打开Build Options选项,在Compiler Settings选项卡下的#defines里面输入CURL_STATICLIB,(这表示使用静态库)
4. 在Linker Settings选项卡下面的link libraries里添加上面curllib/lib目录里的四个文件:
C:\curllib\lib\libcurl.a
C:\curllib\lib\libcurldll.a
C:\curllib\lib\libwldap32.a
C:\curllib\lib\libws2_32.a
然后回到工程页面,点击Build即可
需要注意的是,本文中编译的是不带ssl和zlib支持的libcurl,如果需要编译支持ssl和zlib的curl,还需要先编译openssl,zlib和libssh,编译zlib比较简单,直接使用源码自带的makefile文件即可,编译openssl需要安装MSYS和Perl,还需要修改一些代码,libssh的编译依赖openssl,网上都可以找到方法,也可以看源码的README文件。
附一篇在C语言中使用libcurl库的文章供参考:
使用 cURL 和 libcurl 通过 Internet 进行对话
下面几篇是Curl的文档和教程:
Scripting HTTP Requests Using Curl
Curl Man Page
Curl Mannul
Using The libcurl C Interface
libcurl – small example snippets
programming with libcurl
2:生成DLL
#include <stdio.h>
#include <stdlib.h>
#include "./curllib/include/curl.h"
size_t callback_write_file(void *ptr, size_t size, size_t nmemb, void *userp)
{
//fprintf(stdout,"size=%d\n",size);
fwrite(ptr,size,nmemb,(FILE *)userp);
return size * nmemb; //必须返回这个大小, 否则只回调一次, 不清楚为何.
}
<span style="color:#ff0000;">__declspec(dllexport) </span>void *<span style="color:#ff0000;"> __cdecl</span> func_download_file(FILE *fp)
{
CURL *curl = NULL;
CURLcode res;
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, "http://10.255.64.30:8082/20140225/vt/01B5CE3D7366577E5A85179BCAC742C9.8BB4DB74.8d8c8a829de211e3aae200266cf463ac"); //设置下载的URI
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 20); //设置超时
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); //屏蔽其它信号
//curl_easy_setopt(curl, CURLOPT_HEADERDATA, 1); //下载数据包
//curl_easy_setopt(curl, CURLOPT_RANGE, "0-500"); //用于断点续传, 设置下载的分片
//char buffer[MAXHEADLEN] = {0x0};
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback_write_file); //设置下载数据的回调函数
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
res = curl_easy_perform(curl);
if(res != CURLE_OK)
{
fprintf(stdout,"curl execute fail\n");
}
curl_easy_cleanup(curl);
curl_global_cleanup();
return 0;
}
在codeblocks中加入libcurl需要的.a文件,然后
在Compiler Settings选项卡下的#defines里面输入CURL_STATICLIB,(这表示使用静态库)
3:调用DLL
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
typedef int (*func_download_file_p)(FILE *fp);
int main()
{
HINSTANCE hinstance=NULL;
FILE *fp = NULL;
fp = fopen("./download","wb");
if(!fp)
{
fprintf(stdout,"fopen fail \n");
}
func_download_file_p func_download_file;
//加载动态链接库
hinstance = LoadLibrary("F:\\Program Files\\CodeBlocks\\workspace\\TestCurlDll2\\libTestCurlDll.dll");
func_download_file = (func_download_file_p)GetProcAddress(hinstance, "func_download_file");
func_download_file(fp);
return 0;
}
4:libcurl的使用
- CURLcode curl_global_init(long flags)
- void curl_global_cleanup(void)
- CURL *curl = curl_easy_init();
- curl_easy_cleanup(curl);
- CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter);
- option:
- CURLOPT_WRITEFUNCTION //设置回调函数
- CURLOPT_WRITEDATA
- 设置回调函数中的void *userp指针的来源。
- option:
- CURLOPT_NOPROGRESS
- 为了使CURLOPT_PROGRESSFUNCTION被调用. CURLOPT_NOPROGRESS必须被设置为false.
- CURLOPT_PROGRESSFUNCTION
- CURLOPT_PROGRESSFUNCTION 指定的函数正常情况下每秒被libcurl调用一次.
- CURLOPT_PROGRESSDATA
- CURLOPT_PROGRESSDATA指定的参数将作为CURLOPT_PROGRESSFUNCTION指定函数的参数.
- 整个处理与下载数据回调的处理相同.
- 3. 其它常用属性.
option: - CURLOPT_URL
- 设置访问的URI.
- CURLOPT_NOSIGNAL
- 屏蔽其它信号.
- CURLOPT_HEADER
- 取数据时连同HTTP头部一起取回.
- CURLOPT_HEADERFUNCTION
- CURLOPT_HEADERDATA
- 只取HTTP头部数据, 处理与下载数据回调的处理相同.
- CURLOPT_TIMEOUT
- 超时时间.
- CURLOPT_CONNECTIONTIMEOUT
- 连接等待时间.
- CURLOPT_FOLLOWLOCATION
- 设置支持302重定向
- CURLOPT_RANGE
- 断点续传, 指定传输分片, 格式:"0-200"
- CURLcode curl_easy_perform(CURL *handle);
This function will convert the given input string to an URL encoded string and return that as a new allocated string. All input characters that are not a-z, A-Z or 0-9 will be converted to their "URL escaped" version (%NN where NN is a two-digit hexadecimal number).
If the 'length' argument is set to 0, curl_escape() will use strlen() on the input 'url' string to find out the size.
You must curl_free() the returned string when you're done with it.
本文详细介绍了如何在Linux和Windows环境下编译libcurl源码,包括生成DLL和调用DLL的方法。在Linux下,只需根据需求disable相应功能;在Windows下,使用MinGW或VC环境进行编译。编译完成后,文章提供了如何在C语言项目中使用libcurl库的步骤,包括添加头文件、链接库和设置编译选项。此外,还提及了编译支持ssl和zlib的方法以及libcurl常用选项的设置,如CURLOPT_URL、CURLOPT_WRITEFUNCTION等。

1万+

被折叠的 条评论
为什么被折叠?



