linux curl编译错误:curlrules.h:143:41: error: size of array ‘__curl_rule_01__’ is negative解决办法

14人阅读 评论(0) 收藏 举报

libcurl主要功能就是用不同的协议连接和沟通不同的服务器~也就是相当封装了的sockPHP 支持libcurl(允许你用不同的协议连接和沟通不同的服务器)。, libcurl当前支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传(当然你也可以使用PHP的ftp扩展), HTTP基本表单上传,代理,cookies,和用户认证

编译配置:

正常情况下,我们不需要强制配置curlib的编译方式(32位或64位),配置如下:

./configure --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  (编译选项可自行配置)

make 

make install


但是如果在64位编译机上编译的curlib库,在32位机器上使用为出现错误:

curlrules.h:143:41: error: size of array ‘__curl_rule_01__’ is negative
     [CurlchkszEQ(long, CURL_SIZEOF_LONG)];
                                         ^
curlrules.h:153:53: error: size of array ‘__curl_rule_02__’ is negative

     [CurlchkszEQ(curl_off_t, CURL_SIZEOF_CURL_OFF_T)];


此时,就需要强制使用32位方式进行编译,编译脚本改为如下:

CFLAGS='-m32' CPPFLAGS='-m32' ./configure --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  (编译选项可自行配置)

make 

make install


lubcurl的使用如下:

curlhttpclient.h

#ifndef _CURL_H
#define _CURL_H


#include "curl/curl.h" 
#include <iostream>
using namespace std;


class CUrlHttpClient 
{
public:


    CUrlHttpClient(){}
    ~CUrlHttpClient(){}
    /*
功    能  Curl POST请求
    参    数  strURL                输入参数,请求的Url地址,如:http://www.baidu.com 
                strParam              输入参数,Post请求参数,使用Json格式
        strResponse 输出参数,返回的内容
                retCode 输出参数,返回的状态码
    返 回 值  HTTP请求状态码
*/
    CURLcode Post(string strURl, string strParam, string & strResponse, long & retCode);


    /*
功    能  CURL GET请求
参    数  strURL                输入参数,请求的Url地址,如:http://www.baidu.com 
     strResponse 输出参数,返回的内容
     retCode 输出参数,返回的状态码
返 回 值  HTTP请求状态码
*/
    CURLcode Get(const string & strUrl, string & strResponse, long & retCode);


/*
功    能  请求回复信息处理函数
参    数  pBuffer               服务器回复信息字符串
                     size 获取数据的单字节数【1】
                     count size的个数
                    pParam 预置的配置参数
    返 回 值  服务器消息的字节数
    说    明  
pParam为在发送数据请求时配置的参数,通常是文件指针,或字符串地址
这里使用字符处,保存服务器返回数据
*/
    static size_t onReqReply(void *pBuffer, size_t size, size_t count, void *pParam);



static int onDebug(CURL *pcurl, curl_infotype itype, char * pData, size_t size, void *);  
private:
static  bool m_bDebug; 
public:
static  void SetDebug(bool bDebug);
};


#endif


curlhttpclient.cpp


#include "curlhttpclient.h"


CURLcode CUrlHttpClient::Post(string strURl, string strParam, string &strResponse, long & retCode)
{
// 初始化 CURL 全局变量,并分配全局资源
curl_global_init(CURL_GLOBAL_ALL);


CURLcode returnCode;


/* 初始化CURL,并获取句柄 */
CURL * curl = curl_easy_init();  
if(NULL == curl)  
{
return returnCode;  
}


if(m_bDebug)  
{
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); // 配置非0,表示输出调试信息 
curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, &onDebug); // 打印完整的调试信息
}


/* 配置URL */
curl_easy_setopt(curl, CURLOPT_URL, strURl.c_str());
curl_easy_setopt(curl, CURLOPT_POST, 1); // 配置非0,表示发送POST请求


/* 配置HTTP请求 header*/
curl_slist *headers = curl_slist_append(NULL, "Content-Type:application/json;charset=UTF-8");  
headers = curl_slist_append(headers, "Accept:application/json");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); 


/* POST请求信息配置 */ 
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, strParam.c_str()); // 设置POST请求参数
curl_easy_setopt(curl, CURLOPT_HEADER, 0); // 配置为0,表示返回的内容里不包含http header
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, onReqReply); // 配置返回数据时执行的回调函数,可对返回数据进行处理
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&strResponse);    // 设置传递给回调函数的第4个参数
curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);  
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT_MS, 2000);  
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10);  


/* 执行POST请求,并获取返回值*/ 
returnCode = curl_easy_perform(curl);  


/* 获取状态码 */
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE , &retCode); 


curl_slist_free_all(headers);  


/* 释放资源 */
curl_easy_cleanup(curl);


/* 释放全局资源 */
curl_global_cleanup(); 

return returnCode;  
}


CURLcode CUrlHttpClient::Get(const string & strUrl, string & strResponse, long & retCode)
{
// 初始化 CURL 全局变量,并分配全局资源
curl_global_init(CURL_GLOBAL_ALL);


CURLcode returnCode;


/* 初始化CURL,并获取句柄 */
CURL * curl = curl_easy_init();  
if(NULL == curl)  
{  
return returnCode;  
}


if(m_bDebug)  
{
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); // 配置非0,表示输出调试信息 
curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, onDebug); // 打印完整的调试信息
}


/* 配置URL */
curl_easy_setopt(curl, CURLOPT_URL, strUrl.c_str());

curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);  
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, onReqReply); // 配置返回数据时执行的回调函数,可对返回数据进行处理
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&strResponse);    // 设置传递给回调函数的第4个参数
    /** 
    * 当多个线程都使用超时处理的时候,同时主线程中有sleep或是wait等操作。 
    * 如果不设置这个选项,libcurl将会发信号打断这个wait从而导致程序退出。 
    */  
    curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
    curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 6);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10);


/* 执行POST请求,并获取返回值*/ 
returnCode = curl_easy_perform(curl);  


/* 获取状态码 */
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE , &retCode); 


/* 释放资源 */
curl_easy_cleanup(curl);


/* 释放全局资源 */
curl_global_cleanup(); 


return returnCode;  
}


 size_t CUrlHttpClient::onReqReply(void *pBuffer, size_t size, size_t count, void *lpVoid)
 {  
 string* str = dynamic_cast<string*>((string *)lpVoid);  
 if( NULL == str || NULL == pBuffer )  
 {  
 return -1;  
 }


 char* pData = (char*)pBuffer;  
 cout << "[" << pBuffer << ']';  
 str->append(pData, size * count);
 
 return size * count;  
  }


 int CUrlHttpClient::onDebug(CURL *pcurl, curl_infotype itype, char * pData, size_t size, void *)  
 {  
if(itype == CURLINFO_TEXT) 
{  
cout << "[TEXT]:" << pData;  
}  
else if(itype == CURLINFO_HEADER_IN)  
{  
cout << "[HEADER_IN]:" << pData;  
}  
else if(itype == CURLINFO_HEADER_OUT)  
{  
cout << "[HEADER_OUT]:" << pData;  
}  
else if(itype == CURLINFO_DATA_IN)  
{  
cout << "[DATA_IN]:" << pData;  
}  
else if(itype == CURLINFO_DATA_OUT)  
{  
cout << "[DATA_OUT]:" << pData;  
}  
return 0;  
 }


 bool CUrlHttpClient::m_bDebug = false;


 void CUrlHttpClient::SetDebug(bool bDebug)
 {
m_bDebug = bDebug;  
 }


使用:

        s8 achUrl[TP_REC_FILE_LEN + 1];
string strResponse;
long retCode;
sprintf(achUrl, "http://%s/%s?ssoToken=%s", tSSOServerInfo.achSSOServer, SSO_LOGIN_OUT, strToken.c_str());

m_cUrlHttpClient.Post(achUrl, "", strResponse, retCode);

strResponse 是网络访问的返回内容,retCode是网络请求返回码


查看评论

深入Javascript 异常(Error)视频课程

-
  • 1970年01月01日 08:00

'__curl_rule_01__'declared as an array with a negative size

说明
  • Folish_Audi
  • Folish_Audi
  • 2014-09-11 13:34:32
  • 3917

curl编译

curl是利用URL语法在命令行方式下工作的文件传输工具     它支持很多协议:FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及...
  • z157794218
  • z157794218
  • 2014-10-21 10:43:32
  • 2934

curl编译cocos2dx不通过

  • 2015年07月18日 18:04
  • 1.18MB
  • 下载

__curl_rule_01__ declared as an array with a negative size

升级xcode5.1之后,cocos2d-x,打包出现__curl_rule_01__ declared as an array with a negative size,解决办法,把Build Se...
  • kinglong0001
  • kinglong0001
  • 2014-03-21 22:26:35
  • 3337

xcode更新到5.1,"__curl_rule_01__' declared as an array with a negative size"

在Valid Architectures下面删除
  • qiang12200
  • qiang12200
  • 2014-04-08 20:30:22
  • 4430

IOS cocos2dx编译的curl报错‘__curl_rule_01__'

  • 2018年01月24日 16:48
  • 1.19MB
  • 下载

compile kernel error-- size of unnamed array is negative无名数组的大小为负

今天在编译linux内核的时候遇到如下错误提示: include/linux/rcupdate.h: 在函数‘__kfree_rcu’中: include/linux/rcupdate.h:822:...
  • XscKernel
  • XscKernel
  • 2013-05-17 14:55:22
  • 4430

xcode升级到5.0.2之后,cocos2d-x-2.2下的所有工程,第一次打开时编译报错的解决办法

xcode升级到5.0.2之后,cocos2d-x-2.2用python脚本新建的cpp工程,比如: ./create_project.py -project xxx  -package com.dc...
  • wk3368
  • wk3368
  • 2013-11-30 21:49:12
  • 6222

嵌入式内核编译错误解决办法

本解决办法从网络搜集整理,仅供个人学习之用 1,implicit declaration of function 'kzalloc' 解决方法  #include 2,implicit de...
  • u010918541
  • u010918541
  • 2015-01-26 13:18:08
  • 612
    个人资料
    等级:
    访问量: 3886
    积分: 139
    排名: 116万+
    文章存档