libcurl 支持 openssl 交叉编译 mips rt5350

首先说明一下,我要这个库的目的。我在RT5350上跑openWRT需要向服务器提交数据,用http协议,且需要ssl加密。经过网上查找只有libcurl合适,于是我用mipsel-openwrt-linux-gcc开始交叉编译libcurl,

开始的时候一直在CSDN下载 libcurl的源代码包,版本不一样里面Makefile也会有差别,一直报错,具体错误我没记录下来可惜,后来我在github找一份比较新的版本curl-7.51.0.tar.gz  最好还是去官网下载 我刚开始可能就是源码包不对 。经过一星期的折腾终于把这个编译好了,但是我要支持https所以还需要加openssl,参考博客, 但是别人写的博客说的也不一定适合自己用,所以我才记录下这篇博客



一、用mipsel-openwrt-linux-gcc 编译libcurl

如果不需要支持ssl的话配置的时候要把 ssl 关了

1.解压安装包 tar -xvf curl-7.51.0.tar.gz 

2.进入目录  cd curl-7.51.0

3.配置   ./configure --prefix=/opt/libcurl-lib  CC=mipsel-openwrt-linux-gcc --host=mipsel-linux  -with-ssl=/opt/openssl-lib/  

 --prefix后面跟的是你到时候库要放的地方,就像Linux装软件一样装在哪里,由于我不是要在虚拟机运行只要这个库,所以就选/opt/libcurl-lib这个目录,到时候下面一步就知道了

CC=这个是配置交叉编译链

 --host=mipsel-linux这个网上说是目标机,也就是这个库到时候编译出来的程序要运行的那设备,我也不懂 

-with-ssl=/opt/openssl-lib/  这个就是打开ssl, 有的版本默认是打开 有的是默认关闭,自己去看吧哈哈, =/opt/openssl-lib/这个就是你的依赖库放在哪里,我就放这了,待会儿会讲为啥

4.编译 make -j4   -j4是为了编译的时候更快 好像是4核吧

5.安装(生成库) make install 经过这一步就会把生成的库等等放在配置的时候这个里面--prefix=/opt/libcurl-lib  应该是把源码包那边需要的东西拷贝到这里面


二、上面说了需要依赖库openssl的库,那我们一起来编译OpenSSL吧

源码包openssl-1.0.1u.tar.gz

先说一下为什么没有选择比较新的版本,因为我用了很多版本,Makefile都有差别为参考博客http://blog.csdn.net/clirus/article/details/50151427

我就选了跟他比较接近的版本,不过他说的“如果是mips交叉编译,修改完makefile后仍需要将此makefile文件中的-m64 后缀全部去掉。”这个我没这一步,找不到-m64

1.解压 

2.进入目录

3.配置  ./config  no-asm shared  --prefix=/opt/openssl-lib  --cross-compile-prefix=mipsel-openwrt-linux-

  no-asm 这个我也不太懂 说什么不依赖汇编啥的吧,不懂不懂就跟着加上去

 shared这个是因为需要生成动态库,  如果不加shared编译的时候 就不会有 -fPIC,自己去观察, 但是在编译libcurl的时候就报错说什么编译的时候没有-fPIC,我按网上的说的在Makefile修改 加上-fPIC也没有用  所以还是加上shared吧

   --prefix=/opt/openssl-lib 这个前面提到了 就是生成的库要放到这里里面,编译libcurl的时候依赖库路径就要指定到这

 --cross-compile-prefix=mipsel-openwrt-linux- 这个就是配置交叉编译链


这上面一、二 顺序是颠倒的其实是要编译OpenSSL,再编译libcurl

 

终于编译出来,哎。。。。。。。。。。

测试程序也上吧

  1. #include <string>  
  2.   
  3. using namespace std;  
  4.   
  5. FILE *fp;  
  6. //这个函数是为了符合CURLOPT_WRITEFUNCTION而构造的  
  7. //完成数据保存功能  
  8. size_t WriteData(void *ptr, size_t size, size_t nmemb, void *stream)  
  9. {  
  10.     int written = fwrite(ptr, size, nmemb, (FILE *)fp);  
  11.     return written;  
  12. }  
  13. int postUrl(char *strUserPassword)  
  14. {  
  15.     CURL *curl;  
  16.     CURLcode res;  
  17.     struct curl_httppost *post=NULL;  
  18.     struct curl_httppost *last=NULL;  
  19.   
  20.     string strCredstr = //  
  21.     string strCurlOpt_url = // 自己要连接的服务器地址  
  22.   
  23.     if((fp=fopen("/opt/1.txt","w"))==NULL)  
  24.     {  
  25.         printf("fopen( /opt/1.txt)   fail\n");  
  26.         exit(1);  
  27.     }  
  28.   
  29.     curl = curl_easy_init();  
  30.     if (curl)  
  31.     {  
  32.         curl_easy_setopt(curl, CURLOPT_URL,strCurlOpt_url.c_str()); // 指定url  
  33.         curl_formadd(&post, &last, CURLFORM_COPYNAME, "grant_type",CURLFORM_COPYCONTENTS, strCredstr.c_str(), CURLFORM_END);  
  34.         curl_easy_setopt(curl, CURLOPT_HTTPPOST, post);  
  35.         curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);  
  36.         curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);  
  37.         curl_easy_setopt(curl, CURLOPT_USERPWD, strUserPassword);  
  38.   
  39.         //CURLOPT_WRITEFUNCTION 将后继的动作交给write_data函数处理  
  40.         //回调函数原型为:size_t function( void *ptr, size_t size, size_t nmemb, void *stream);  
  41.         //函数将在libcurl接收到数据后被调用,因此函数多做数据保存的功能,如处理下载文件。  
  42.         //CURLOPT_WRITEDATA 用于表明CURLOPT_WRITEFUNCTION函数中的stream指针的来源。  
  43.         curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteData);  
  44.   
  45.         res = curl_easy_perform(curl);  
  46.         printf("%d  %s\n",res, curl_easy_strerror(res));  
  47.         curl_easy_cleanup(curl);  
  48.     }  
  49.     fclose(fp);  
  50.     return 1;  
  51. }  
  52. int main(void)  
  53. {  
  54.     string  strUsername = "401f8c403a9447119d722b592b2c9957";  
  55.     string  strPassword = "415d320b18974921b66569d6a89ef369";  
  56.   
  57.     char  acUserName[1024] = " ";  
  58.     snprintf(acUserName, sizeof(acUserName), "%s:%s",strUsername.c_str(), strPassword.c_str());  
  59.   
  60.     curl_global_init(CURL_GLOBAL_SSL);  
  61.     postUrl(acUserName);  
  62. }  


噢对了 还有一点就是要把库都加进去,在eclipse加库还有顺序,自己去试吧 我也没法讲清,我也不知道为啥。不懂就留言吧

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值