ARM平台移植libcurl curl-7.49.0

ARM 227浏览

转自  : http://blog.csdn.net/miaodichiyou/article/details/51451134

libcurl是免费的轻量级的客户端网络库,支持DICT,
FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS,POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, Telnet, TFTP.支持SSL, HTTPPOST,HTTPPUT, FTP上传, HTTP form上传,代理,cookies, 用户名与密码认证。

系统环境:Ubuntu 14.04.3 LTS
源码:curl-7.49.0.tar.gz (https://curl.haxx.se/download.html)
交叉编译环境:arm-none-linux-gnueabi-
[zhaojq@virtual-machine]# tar -zxvf curl-7.49.0.tar.gz
[zhaojq@virtual-machine]# cd curl-7.49.0/
[zhaojq@virtual-machine]# ./configure --prefix=/home/zhaojq/libcurl --host=arm-none-linux CC=arm-none-linux-gnueabi-gcc CXX=arm-none-linux-gnueabi-g++
[zhaojq@virtual-machine]# make
[zhaojq@virtual-machine]# make install
生成成功
交叉编译后的文件在/home/zhaojq/libcurl目录下
[zhaojq@virtual-machine libcurl]# ls
bin  include  lib  share

libcurl头文件在include/curl目录
[zhaojq@virtual-machine libcurl/include/curl]# ls
curlbuild.h  curl.h  curlrules.h  curlver.h  easy.h  mprintf.h  multi.h  stdcheaders.h  typecheck-gcc.h

交叉编译后的动态库文件在lib目录
[zhaojq@virtual-machine libcurl/lib]# ls

libcurl.a  libcurl.la  libcurl.so  libcurl.so.4  libcurl.so.4.4.0  pkgconfig
编译test实例
https://curl.haxx.se/libcurl/c/example.html

post-callback An example source code that issues a HTTP POST and we provide the actual data through a read callback.
[zhaojq@virtual-machine]# vim libcurl_test.cpp
[cpp] view
plain
 copy

 在CODE上查看代码片派生到我的代码片

  1. #include <stdio.h>  
  2. #include <string.h>  
  3. #include <curl/curl.h>  
  4.    
  5. const char data[]="this is what we post to the silly web server";  
  6.    
  7. struct WriteThis {  
  8.   const char *readptr;  
  9.   long sizeleft;  
  10. };  
  11.    
  12. static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userp)  
  13. {  
  14.   struct WriteThis *pooh = (struct WriteThis *)userp;  
  15.    
  16.   if(size*nmemb < 1)  
  17.     return 0;  
  18.    
  19.   if(pooh->sizeleft) {  
  20.     *(char *)ptr = pooh->readptr[0]; /* copy one single byte */   
  21.     pooh->readptr++;                 /* advance pointer */   
  22.     pooh->sizeleft--;                /* less data left */   
  23.     return 1;                        /* we return 1 byte at a time! */   
  24.   }  
  25.    
  26.   return 0;                          /* no more data left to deliver */   
  27. }  
  28.    
  29. int main(void)  
  30. {  
  31.   CURL *curl;  
  32.   CURLcode res;  
  33.    
  34.   struct WriteThis pooh;  
  35.    
  36.   pooh.readptr = data;  
  37.   pooh.sizeleft = (long)strlen(data);  
  38.    
  39.   /* In windows, this will init the winsock stuff */   
  40.   res = curl_global_init(CURL_GLOBAL_DEFAULT);  
  41.   /* Check for errors */   
  42.   if(res != CURLE_OK) {  
  43.     fprintf(stderr, "curl_global_init() failed: %sn",  
  44.             curl_easy_strerror(res));  
  45.     return 1;  
  46.   }  
  47.    
  48.   /* get a curl handle */   
  49.   curl = curl_easy_init();  
  50.   if(curl) {  
  51.     /* First set the URL that is about to receive our POST. */   
  52.     curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/index.cgi");  
  53.    
  54.     /* Now specify we want to POST data */   
  55.     curl_easy_setopt(curl, CURLOPT_POST, 1L);  
  56.    
  57.     /* we want to use our own read function */   
  58.     curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);  
  59.    
  60.     /* pointer to pass to our read function */   
  61.     curl_easy_setopt(curl, CURLOPT_READDATA, &pooh);  
  62.    
  63.     /* get verbose debug output please */   
  64.     curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);  
  65.    
  66.     /* 
  67.       If you use POST to a HTTP 1.1 server, you can send data without knowing 
  68.       the size before starting the POST if you use chunked encoding. You 
  69.       enable this by adding a header like "Transfer-Encoding: chunked" with 
  70.       CURLOPT_HTTPHEADER. With HTTP 1.0 or without chunked transfer, you must 
  71.       specify the size in the request. 
  72.     */   
  73. #ifdef USE_CHUNKED  
  74.     {  
  75.       struct curl_slist *chunk = NULL;  
  76.    
  77.       chunk = curl_slist_append(chunk, "Transfer-Encoding: chunked");  
  78.       res = curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);  
  79.       /* use curl_slist_free_all() after the *perform() call to free this 
  80.          list again */   
  81.     }  
  82. #else  
  83.     /* Set the expected POST size. If you want to POST large amounts of data, 
  84.        consider CURLOPT_POSTFIELDSIZE_LARGE */   
  85.     curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, pooh.sizeleft);  
  86. #endif  
  87.    
  88. #ifdef DISABLE_EXPECT  
  89.     /* 
  90.       Using POST with HTTP 1.1 implies the use of a "Expect: 100-continue" 
  91.       header.  You can disable this header with CURLOPT_HTTPHEADER as usual. 
  92.       NOTE: if you want chunked transfer too, you need to combine these two 
  93.       since you can only set one list of headers with CURLOPT_HTTPHEADER. */   
  94.    
  95.     /* A less good option would be to enforce HTTP 1.0, but that might also 
  96.        have other implications. */   
  97.     {  
  98.       struct curl_slist *chunk = NULL;  
  99.    
  100.       chunk = curl_slist_append(chunk, "Expect:");  
  101.       res = curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);  
  102.       /* use curl_slist_free_all() after the *perform() call to free this 
  103.          list again */   
  104.     }  
  105. #endif  
  106.    
  107.     /* Perform the request, res will get the return code */   
  108.     res = curl_easy_perform(curl);  
  109.     /* Check for errors */   
  110.     if(res != CURLE_OK)  
  111.       fprintf(stderr, "curl_easy_perform() failed: %sn",  
  112.               curl_easy_strerror(res));  
  113.    
  114.     /* always cleanup */   
  115.     curl_easy_cleanup(curl);  
  116.   }  
  117.   curl_global_cleanup();  
  118.   return 0;  
  119. }  

[zhaojq@virtual-machine]# arm-none-linux-gnueabi-g++ -lcurl -I/home/kt/libcurl/include -L/home/kt/libcurl/lib -o libcurl_test libcurl.cpp
编译通过,在当前目录生成libcurl_test可执行文件

/home/zhaojq/libcurl目录下的所有文件和pkgconfig目录都拷贝到ARM设备上文件系统的/lib目录,
libcurl_test拷贝到ARM设备上

执行./libcurl_test
./libcurl_test: error while loading shared libraries: libssl.so.1.0.0: cannot open shared object file: No such file or directory

libcurl运行需要libssl.so.1.0.0的库,ARM移植openssl-1.0.0s.tar.gz详见另一篇文章
http://blog.csdn.net/miaodichiyou/article/details/50385049

移植成功再次执行./libcurl_test
[root@ARM /]# ./libcurl_test 
*   Trying 93.184.216.34...
* Connected to example.com (93.184.216.34) port 80 (#0)
> POST /index.cgi HTTP/1.1
Host: example.com
Accept: */*
Content-Length: 44
Content-Type: application/x-www-form-urlencoded

* We are completely uploaded and fine
< HTTP/1.1 404 Not Found
< Cache-Control: max-age=604800
< Content-Type: text/html
< Date: Thu, 19 May 2016 02:45:50 GMT
< Expires: Thu, 26 May 2016 02:45:50 GMT
< Server: EOS (lax004/2813)
< Content-Length: 460

<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
        <head>
                <title>404 - Not Found</title>
        </head>
        <body>
                <h1>404 - Not Found</h1>
                <script type="text/javascript" src="http://gp1.wpc.edgecastcdn.net/00222B/jtest/pilot_dns_best_pop.js"></script>
        </body>
</html>
* Connection #0 to host example.com left intact

移植成功。