编译libcurll(添加ssl,zlib)

 

libcurl

A.在windows环境下编译libcurl

Download Microsoft Platform SDK
========================================================
    http://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&displaylang=en
    Install it


Download Zlib Source
========================================================
    from http://www.zlib.net/
    http://www.zlib.net/zlib123.zip


Build Zlib
========================================================
    Use Visual C++ 6
    zlib123/projects/visualc6/zlib.dsw


Download Openssl Source
========================================================
    from http://www.openssl.org/source/
    http://www.openssl.org/source/openssl-0.9.8g.tar.gz


Build Openssl
========================================================
    maybe need to install active perl
    http://lccnc.skycn.com/down/ActivePerl-5.8.8.822-MSWin32-x86-280952.zip

    # run build shell
    cd openssl-***
    ms/32all.bat


Download Curl Source
========================================================
    from http://curl.haxx.se/
    http://curl.haxx.se/download/curl-7.18.1.zip


Build Curl
========================================================
    1. Pre Build
   
    a. create bat file for debug
    call "C:/Program Files/Microsoft Visual Studio/VC98/Bin/vcvars32.bat"
    set CFG=debug-dll-ssl-dll-zlib-dll
    set OPENSSL_PATH=D:/svn_work/MDS/USS/trunk/openssl-0.9.8g
    set ZLIB_PATH=D:/svn_work/MDS/USS/trunk/zlib123-dll
    nmake -f Makefile.vc6

    b. create bat file for release
    call "C:/Program Files/Microsoft Visual Studio/VC98/Bin/vcvars32.bat"
    set CFG=release-dll-ssl-dll-zlib-dll
    set OPENSSL_PATH=D:/svn_work/MDS/USS/trunk/openssl-0.9.8g
    set ZLIB_PATH=D:/svn_work/MDS/USS/trunk/zlib123
    nmake -f Makefile.vc6

    c. save shell code to bat file
    Save to : curl-***/lib/build.bat

    d. modify curl-***/lib/Makefile.vc6
    Find
        CFLAGS     = /I. /I../include /nologo /W3 /GX /DWIN32 /YX /FD /c /DBUILDING_LIBCURL
    set as
        CFLAGS     = /I. /I../include /nologo /W3 /GX /DWIN32 /YX /FD /c /DBUILDING_LIBCURL  /I"C:/Program Files/Microsoft Platform SDK/Include"

    e. copy zlib123/projects/visualc6/Win32_DLL_Release/zlib1.lib to curl-7.18.1/lib/zdll.lib


    2. Build
    cd curl-***/lib
    build.bat
   

Windows下使用libcurlcurlpp
<!--[if !vml]--><!--[endif]-->

1. 下载libcurlcurlpp源代码

http://curl.haxx.se/

http://rrette.com/textpattern/index.php?s=cURLpp

例如下载

http://curl.haxx.se/download/curl-7.16.2.tar.bz2

http://rrette.com/files/curlpp/curlpp-0.7/curlpp-0.7.0.tar.gz

 

2. 下载zlib

http://www.zlib.net/

例如下载

http://www.zlib.net/zlib123-dll.zip

 

3. 编译OpenSSL

参考WindowsOpenssl安装以及编程(Visual C++)

 

4. 编译libcurl,以VS2005为例

curl-7.16.2.tar.bz2解压到某目录,例如C:/curl,进入C:/curl/lib目录。

zlib123-dll.zip解压到某目录,例如C:/zlib

Openssl的目录为C:/openssl

 

进入Visual Studio 2005命令提示,进入C:/curl/lib

 

( copy    zlib-1.2.4/projects/visualc6/Win32_DLL_Release/zlib1.lib    to    curl-7.20.0.gz/lib/zdll.lib

  

curl-7.20.0.gz/lib>perl Configure VC-WIN32

 

curl-7.20.0.gz/lib>"D:/Program Files/Microsoft Visual Studi
o/VC98/Bin/VCVARS32.BAT"
)

 

 

编译Debug版本。

set CFG=debug-dll-ssl-dll-zlib-dll

set OPENSSL_PATH=C:/openssl

set ZLIB_PATH=C:/zlib/include

nmake -f Makefile.vc6

 

其输出:libcurld_imp.lib, libcurld.dll

 

编译Release版本。

set CFG=release-dll-ssl-dll-zlib-dll

set OPENSSL_PATH=C:/openssl

set ZLIB_PATH=C:/zlib/include

nmake -f Makefile.vc6

其输出:libcurl_imp.lib, libcurl.dll

如果需要编译其他版本,可查看设定相应的CFG 参数即可。

 

 

5.编译curlpp

curlpp-0.7.0.tar.gz解压到某目录,例如C:/curlpp/curlpp

set CFG=release

nmake -f Makefile.msvc

如果需要编译其他版本,可查看设定相应的CFG 参数即可。

 

需要注意的是可能需要对原文件进行一定的修改。

一种方案是:

修改Makefile.msvcLIBCURL_PATH

修改dllfct.h关于CURLPPAPI的宏定义

#define CURLPPAPI 

 

6.测试

该程序是备份CUBlog程序的C++版,需要boost

 

#include <iostream>
#include <string>
#include <queue>

#include <boost/lexical_cast.hpp>
#include <boost/regex.hpp>
#include <boost/tuple/tuple.hpp>

#include <curlpp/cURLpp.hpp>
#include <curlpp/Easy.hpp>
#include <curlpp/Options.hpp>
#include <curlpp/Exception.hpp>

#pragma comment(lib,"libcurlpp.lib")
#pragma comment(lib,"libcurl_imp.lib")

using namespace std;

#define MAX_FILE_LENGTH 20000

class WriterMemoryClass
{
    
public:
    
// Helper Class for reading result from remote host
    WriterMemoryClass(){
        
this->m_pBuffer = NULL;
        
this->m_pBuffer = (char*) malloc(MAX_FILE_LENGTH * sizeof(char));
        
this->m_Size = 0;
    
}
    
~WriterMemoryClass() {
        
if (this->m_pBuffer)
            
free(this->m_pBuffer);
    
}
    
void* Realloc(void* ptr, size_t size) {
        
if(ptr)
            
return realloc(ptr, size);
        
else
            
return malloc(size);
    
}
    
// Callback must be declared static, otherwise it won't link...
    size_t WriteMemoryCallback(char* ptr, size_t size, size_t nmemb) {
        
// Calculate the real size of the incoming buffer
        size_t realsize = size * nmemb;
        
// (Re)Allocate memory for the buffer
        m_pBuffer = (char*) Realloc(m_pBuffer, m_Size + realsize);
        
// Test if Buffer is initialized correctly & copy memory
        if (m_pBuffer == NULL) {
            realsize
= 0;
        
}
        
        
memcpy(&(m_pBuffer[m_Size]), ptr, realsize);
        m_Size
+= realsize;
        
// return the real size of the buffer...
        return realsize;
    
}
    
    
// Public member vars
    char* m_pBuffer;
    
size_t m_Size;
};

int main(int argc,char * argv[])
{
    
string list_base="http://blog.chinaunix.net/u/8780/article.php?frmid=0&page=";
    
string art_base="http://blog.chinaunix.net/u/8780/showart.php?id=";
    boost
::regex rexp("<a href=/"showart_([0-9]{6}).*?><font.*?><b>(.*?)</b></font></a>");
    boost
::regex fnp("[///:*?/"<>]");
    
typedef boost::tuple<string,string> element;
    
queue<element> q;
    
bool save=true;
    
if(argc==1)
        save
=false;
        
    
try {
        cURLpp
::Cleanup cleaner;
        cURLpp
::Easy request;
        cURLpp
::Easy handler;
       
int i=0;
        
bool cond=true;
        
while(cond) {
            i
++;
            cond
=false;
            
string list_url=list_base+boost::lexical_cast<string>(i);
            
cerr<<list_url<<endl;
            
// Get the content
            WriterMemoryClass mWriterChunk;
            
// Set the writer callback t

 

 

 

HTTP/FTP客户端开发库:libwww、libcurl、libfetch 以及更多

网页抓取和ftp访问是目前很常见的一个应用需要,无论是搜索引擎的爬虫,分析程序,资源获取程序,WebService等等都是需要的,自己开发抓取库 当然是最好了,不过开发需要时间和周期,使用现有的Open source程序是个更好的选择,一来别人已经写的很好了,就近考验,二来自己使用起来非常快速,三来自己还能够学习一下别人程序的优点。

闲来无事,在网上浏览,就发现了这些好东西,特别抄来分享分享。主要就是libwwwlibcurllibfetch 这三个库,当然,还有一些其他很多更优秀库,文章后面会有简单的介绍。

 

libwww
官方网站:http://www.w3.org/Library/
更多信息:http://www.w3.org/Library/User/
运行平台:Unix/LinuxWindows

以下资料来源:http://9.douban.com/site/entry/15448100/http://zh.wikipedia.org/wiki/Libwww

简介:
Libwww
是一个高度模组化用户端的网页存取API ,用C语言写成,可在 Unix Windows 上运行。 It can be used for both large and small applications including: browsers/editors, robots and batch tools. There are pluggable modules provided with Libwww which include complete HTTP/1.1 with caching, pipelining, POST, Digest Authentication, deflate, etc. The purpose of libwww is to serve as a testbed for protocol experiments. 蒂姆·伯纳斯-李 在 1992 年十一月创造出了 Libwww,用於展示网际网路的潜能。使用 Libwww 的应用程式,如被广泛使用的命令列文字浏览器 Lynx Mosaic web browser 即是用 Libwww 所写成的。 Libwww 目前为一开放原始码程式,并於日前移至 W3C 管理。基於其为开放原始码的特性,任何人都能为 Libwww 付出一点心力,这也确保了 Libwww 能一直进步,成为更有用的软体。

操作示例:
最近我需要写点页面分析的东西,这些东西某些程度上类似搜索引擎的爬虫->parser->存储的过程。

过去我常用的抓取页面的库是libcurl,这个东西是unix常用命令curl的基础,curl被称做命令行浏览器,功能强大,支持的协议也全面。遗憾的是libcurl仅仅是个支持多协议的抓取库,不能做解析。

找来找去,发现了w3cLibwww库,这东西功能强大的吓人,不仅有解析,还有robot(也就是爬虫了,或是叫internet walker)功能。在Libwww基础上完成的程序很多,最著名的大概是字符模式的浏览器lynx。我几乎就觉得这就我需要的东西了,立刻dive into

一整天之后,我终于能用这东西抓下来页面,并且从html页面中分析出来一些信息了,但是想更进一步就变的异常困难。因为这个库功能太复杂了。这东 西文档不详细,被人提及的也少。Libwww最近的Release 5.3.2,发布于20001220日。一个有这么多年历史的东西,竟然没多少开发者在讨论,非常不正常。

找来找去,最后在libcurlFAQ里面看到了和Libwww比较, 精选的读者来信告诉我,不仅仅是我一个人被Libwww的复杂弄的晕了头脑,我才花了一整天,写信的那个哥们竟然用了一人月,还是在里面打转,直到换了 curl才好。虽然这是libcurl推销自己的方法,不过这些失败的前辈的经验让我对自己的智商重新有了信心。看来这东西没多少人讨论是正常的...

好吧,我也投降,libcurlhtml解析功能,这没关系,我找别的办法好了...这么复杂的库,再好我也实在没办法忍受下去了,再说我需要的功能其实也真没Libwww那么复杂的。

写程序其实很容易迷失,你会看到一个似乎很完美,什么都能做的东西,一下子就喜欢上它,但是最后往往还是无福消受。往往是那些,不那么成熟,多少有点小毛病的库,组合在一起才是真正的解决方案。

 

libcurl

官方网站:http://curl.haxx.se/libcurl
更多特点:http://curl.haxx.se/docs/features.html
运行平台:Unix/LinuxWindowsWindows上貌似也有实现)

以下资料来源:http://blog.csdn.net/hwz119/archive/2007/04/29/1591920.aspx

 

Libcurl为一个免费开源的,客户端url传输库,支持FTPFTPSTFTPHTTPHTTPSGOPHERTELNETDICTFILELDAP,跨平台,支持WindowsUnixLinux等,线程安全,支持Ipv6。并且易于使用。

http://curl.haxx.se/libcurl/

 

http://curl.haxx.se/libcurl/ 下载一个稳定的版本,注意选择OS

 

编译libcurl

下载下来的是源码包,需要编译。

解压zip文件,进入curl-7.14.0/lib目录(我下载的是7.14.0)。

编译Debug版本。新建一个批处理bat文件,如buildDebug.bat,内容如下:

call "C:/Program Files/Microsoft Visual Studio/VC98/Bin/vcvars32.bat"

set CFG=debug-dll-ssl-dll-zlib-dll

set OPENSSL_PATH=E:/SSL/openssl-0.9.7e

set ZLIB_PATH=E:/zip/zlib123

nmake -f Makefile.vc6

 

其输出libcurld_imp.lib, libcurld.dll

 

编译Release版本。新建一个批处理文件BuildRelease.bat内容如下

call "C:/Program Files/Microsoft Visual Studio/VC98/Bin/vcvars32.bat"

set CFG=release-dll-ssl-dll-zlib-dll

set OPENSSL_PATH=E:/SSL/openssl-0.9.7e

set ZLIB_PATH=E:/zip/zlib123

nmake -f Makefile.vc6

 

其输出libcurl_imp.lib, libcurl.dll

 

上面编译的是libcurl dll使用OpenSSL Dll版本和Zlib Dll版本。如果没有,可以从www.openssl.org 或者http://www.zlib.net/ 下载。

如果需要编译其他版本,可查看Makefile.vc6,设定相应的CFG 参数即可。

 

商业软件使用libcurl时,只需要包含其copywrite声明即可。

 

Sample

 

#include <stdio.h>
#include "../curl-7.14.0/include/curl/curl.h"
#pragma comment(lib, "../curl-7.14.0/lib/libcurl_imp.lib")

int main(void)
{
  curl = curl_easy_init();
  
if(curl) {

    CURLcode res;    
    res = curl_easy_setopt(curl, CURLOPT_PROXY, "Test-pxy08:8080");
    res = curl_easy_setopt(curl, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
    res = curl_easy_setopt(curl, CURLOPT_URL, "http://www.vckbase.com");
    res = curl_easy_perform(curl);

    
if(CURLE_OK == res) {
      
char *ct;
      
/**//* ask for the content-type */
      
/**//* http://curl.haxx.se/libcurl/c/curl_easy_getinfo.html */
      res = curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &ct);

      
if((CURLE_OK == res) && ct)
        printf("We received Content-Type: %s ", ct);
    }

    
/**//* always cleanup */
    curl_easy_cleanup(curl);
  }
  
return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值