交叉编译arm-linux-gnueabi-gcc的libcurl

时间:2015-09-23 06:44:52

标签: c++ linux curl

我一直试图从ubuntu eclipse中交叉编译libcurl 7.35.0 for arm-linux-gnueabi-gcc ++。 我在GCC ++链接器中包含了-lcurl optons。当我试图在G ++编译器中为下面的代码编译代码时,一切进展顺利,构建后没有错误。

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

int main()
{
     return
}

但是当我尝试使用arm-linux-gnueabi-gcc ++进行交叉编译时,但尝试构建它会产生编译错误:

/usr/include/curl/curlrules.h:143:41:错误:数组' curl_rule_01 '的大小为负数 /usr/include/curl/curlrules.h:153:53:错误:数组' curl_rule_02 '的大小为负数

请帮助我指导如何为ARM交叉编译libcurl。

1 个答案:

答案 0 :(得分:5)

我还记得当我不得不交叉编译卷曲时...一天!卷毛做的事情很奇怪,但却很聪明。

如果你看一下那行你会看到:

typedef char
  __curl_rule_01__
    [CurlchkszEQ(long, CURL_SIZEOF_LONG)];

如果你看看CurlchkszEQ,你会得到

#define CurlchkszEQ(t, s) sizeof(t) == s ? 1 : -1

所以这个例程强制执行sizeof(long) == CURL_SIZEOF_LONG,如果没有,它将在该数组初始值设定项中加一个负数,导致构建失败。

这是交易,CURL_SIZEOF_LONGcurlbuild.h中定义,并在x86_64机器上定义为8 ....也就是说,在/usr/include/curl/curlbuild.h中,它设置为8。你不关心x86_64!您正在编译arm ...一个32位架构,其中sizeof(long) == 4,而不是8CURL_SIZEOF_LONG未正确设置为8!因此,您的编译器似乎正在使用/usr/include/...的系统范围的x86_64 curl头文件,而不是交叉编译器的头文件! (例如我的是/opt/cross/arm-unknown-linux-gnueabi/include/...,但你的可能不是)。

因此,在编译编译时,sizeof(long) == 4 != CURL_SIZEOF_LONG并正确崩溃。解决问题的方法在理论上很简单,只需在编译器中更改配置即可使用交叉编译器包含。在Eclipse中,我不知道该怎么做,虽然我确信它是可能的。

您可能会发现从终端构建curl更容易:

curl $ ./configure --host=arm-linux-gnueabi --prefix=/path/to/your/arm-linux-gnueabi/arm-linux-gnueabi
... configure stuff ...
curl $ make && make install