我一直在尝试从 ubuntu eclipse 为arm-linux-gnueabi-gcc++ 交叉编译libcurl 7.35.0。 我已在 GCC++ 链接器中包含 -lcurl 选项。当我尝试在 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。
最佳答案
我记得当我不得不交叉编译curl时......多么美好的一天! curl 所做的事情相当奇怪,但又很聪明。
如果您查看该行,您会看到以下内容:
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
关于c++ - 为arm-linux-gnueabi-gcc交叉编译libcurl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32732753/