libcurl linux 静态链接库_libcurl源码编译及使用

http://blog.csdn.net/b_h_l/article/details/19985061

2014.02

1:linux下源码编译

./configure --prefix=/usr/local/curl --disable-shared --enable-static --without-libidn

--without-ssl --without-librtmp --without-gnutls --without-nss --without-libssh2 --without-zlib --without-winidn --disable-rtsp --disable-ldap --disable-ldaps --disable-ipv6

注意:不需要其它功能就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 

#include 

#include 

#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文件。

2:生成DLL

#include 

#include 

#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;     //必须返回这个大小, 否则只回调一次, 不清楚为何.

}

__declspec(dllexport) void * __cdecl 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,(这表示使用静态库)

执行后可生成.dll

3:调用DLL

#include 

#include 

#include 

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的使用

一、常用函数

1) libcurl的全局初始化及释放

CURLcode curl_global_init(long flags)

flags: CURL_GLOBAL_ALL     //初始化所有的可能的调用。

CURL_GLOBAL_SSL     //初始化支持 安全套接字层。

CURL_GLOBAL_WIN32   //初始化win32套接字库。

CURL_GLOBAL_NOTHING //没有额外的初始化。

void     curl_global_cleanup(void)

应该在程序开始时调用初始化函数. 虽然不调用这个初始化函数, libcurl会在curl_easy_init()函数中自动调用. 但在多线程处理时, 可能会出现多次自动调用的情况.

2) 初始化下载handle及释放

CURL *curl = curl_easy_init();

curl_easy_cleanup(curl);

3) 设置下载属性. 及常用参数.

CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter);

1.设置下载数据的回调函数.

option:

CURLOPT_WRITEFUNCTION //设置回调函数

回调函数原型为: size_tfunction(void*ptr,size_t

size,size_t nmemb,void*userp);函数将在libcurl接收到数据后被调用。

void *ptr是下载回来的数据.

void *userp是用户指针,

用户通过这个指针传输自己的数据.

CURLOPT_WRITEDATA

设置回调函数中的void *userp指针的来源。

2.下载进度控制.

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"

4) 开始下载

CURLcode curl_easy_perform(CURL *handle);

5) URL encodes the given string(http://curl.haxx.se/libcurl/c/curl_escape.html)

char *curl_escape( char * url , int length );

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.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值