【问题标题】:Cross compile libcurl for arm-linux-gnueabi-gcc为 arm-linux-gnueabi-gcc 交叉编译 libcurl
【发布时间】:2015-12-20 08:50:48
【问题描述】:

我一直在尝试从 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。

【问题讨论】:

    标签: c++ linux curl


    【解决方案1】:

    我记得当我不得不交叉编译 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 中,它定义为 8... 在 x86_64 机器上。也就是说,在/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
    

    【讨论】:

    • @JJoshua Rahm 感谢您的 cmets。我确实尝试像这样手动更改 curlbuild.h 中的定义来解决问题: CURL_SIZEOF_LONG 4 CURL_SIZEOF_CURL_OFF_T 4 但后来我收到错误 /usr/lib/x86_64-linux-gnu/libcurl.so: file not Recognized: File format not Recognized和 Collect2: error: ld 返回 1 个退出状态。
    • 对,您的交叉编译器没有设置正确的路径。它正在查找 x86 标头和 x86 库。当您尝试链接时,您的交叉编译器正在尝试将 arm 二进制文件与 x86 库链接。在 Eclipse 中,您需要告诉它查找 arm 库和 arm 头文件。即您的构建设置使用-I/usr/include -L/usr/include 他们应该使用类似-I/usr/share/cross/arm-linux-gnueabi/include -L/usr/share/cross/arm-linux-gnueabi/lib 的东西(确切的路径取决于交叉编译器的构建方式)
    • @JJoshua Rahm 我是本节的新手。请指导我如何设置正确的路径以及我应该设置什么命令。实际上,当我运行简单的代码 eclipse 并使用 arm-linux-gnuebi 编译器进行交叉编译时,它运行良好,因为我在 GCC C++ 编译器中使用“-I/usr/arm-linux-gnueabi/include/c++/”设置了构建设置4.7.3 -O0 -g3 -Wall -c -fmessage-length=0" 并且 GCC C++ 链接器路径是 "-L/usr/arm-linux-gnueabi/lib -lcurl -Wl,-Bsymbolic-functions -Wl,- z,relro”。仅当我尝试使用 arm-linux-gnueabi 编译 curl libery 时才会出现此问题。
    • 交叉编译很困难,部分原因是编译器对构建它们的环境非常敏感。我不知道您是如何获得编译器的,但对于交叉编译,我一般可以这么说:
    • sorry- 不小心按了 默认情况下,你的交叉编译器应该使用正确的路径。与 gcc 一样,它会自动指向该架构的正确 includelib 目录。如果我确切地知道您的 Eclipse 是如何设置来编译这个应用程序的,这可能会有所帮助。如果我不得不猜测,它可能是用-L/usr/lib 显式设置库路径,这是 bad 因为那是 x86 库所在的位置。你会想要删除它。您是否尝试过在命令行上编译您的应用程序?您上面提供的简单示例应该很容易编译。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 2012-02-11
    • 2013-01-29
    相关资源
    最近更新 更多