我一直试图从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。
答案 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_LONG
在curlbuild.h
中定义,并在x86_64机器上定义为8
....也就是说,在/usr/include/curl/curlbuild.h
中,它设置为8
。你不关心x86_64!您正在编译arm ...一个32位架构,其中sizeof(long) == 4
,而不是8
和CURL_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