c++ - 为arm-linux-gnueabi-gcc交叉编译libcurl

标签 c++ linux curl

我一直在尝试从 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,而不是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

关于c++ - 为arm-linux-gnueabi-gcc交叉编译libcurl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32732753/

相关文章:

c++ - 将唯一值左移并删除字符串中的重复值

c++ - CImg 错误 : Failed to recognize format of file "xxx.png"

linux - bash case 语句中出现语法错误

javascript - Azure 翻译 API - 限制客户端请求

php - 使用 multipart/form-data 上传 curl 文件

c++ - 搜索字符串中的垃圾字符

c++ - 如何使用 c++ 和 openssl 防御 TLS GOLDENDOODLE?

java - 如何使用 64 位浏览器和 64 位 java 插件在 64 位 Linux 上获取 32 位 JRE 路径

linux - 在shell中使用perl -e命令时引用问题

尽管传递了参数,但 REST Api 调用失败,因为缺少参数