C++ 针对arm linux gnueabi gcc的交叉编译libcurl

C++ 针对arm linux gnueabi gcc的交叉编译libcurl,c++,linux,curl,C++,Linux,Curl,我一直在尝试从ubuntu eclipse为arm linux gnueabi gcc++交叉编译libcurl 7.35.0。 我在GCC++链接器中包含了-lcurl opton。当我尝试在G++编译器中为下面的代码编译代码时,一切都进行得很顺利,在构建之后没有出现任何错误 #include <iostream> #include <curl/curl.h> using namespace std; int main() { return } #包括 #

我一直在尝试从ubuntu eclipse为arm linux gnueabi gcc++交叉编译libcurl 7.35.0。 我在GCC++链接器中包含了-lcurl opton。当我尝试在G++编译器中为下面的代码编译代码时,一切都进行得很顺利,在构建之后没有出现任何错误

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

int main()
{
     return
}
#包括
#包括
使用名称空间std;
int main()
{
返回
}
但是,当我尝试使用arm linux gnueabi gcc++进行交叉编译,但尝试构建时,会产生编译错误:

/usr/include/curl/curlrules.h:143:41:错误:数组“curl\u rule\u 01”的大小为负 /usr/include/curl/curlrules.h:153:53:错误:数组“curl\u rule\u 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\u sizeof\u long
,如果不执行,它将在数组初始值设定项中放入一个负数,并导致生成失败

下面是交易,
CURL\u SIZEOF\u LONG
curlbuild.h
中定义,它被定义为
8
。。。在x86_64计算机上。也就是说,在
/usr/include/curl/curlbuild.h
中,它被设置为
8
。不过,您并不关心x86_64!你正在编译arm。。。一个32位体系结构,其中
sizeof(long)==4
,而不是
8
CURL\u sizeof\u long
被不正确地设置为
8
!因此,您的编译器似乎是在
/usr/include/…
上选择系统范围的x86_64 curl头文件,而不是交叉编译器的头文件!(例如,我的在
/opt/cross/arm unknown linux gnueabi/include/…
中,但你的可能不是)

因此,在编译编译器时,解析为
sizeof(long)==4!=卷曲长
并正确崩溃。解决这个问题的方法在理论上很简单,只需在编译器中更改配置以使用交叉编译器包含。在Eclipse中,我不确定如何做,尽管我确信这是可能的

您可能会发现从终端构建curl更容易,如下所示:

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

@谢谢你的评论。我确实尝试手动更改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 and 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
(具体路径取决于交叉编译器的构建方式)@约书亚·拉姆我对这一部分很陌生。你能指导我如何设置正确的路径以及我应该设置什么命令吗。实际上,当我用ARM Linux Linux GunuBi编译器运行简单的代码Eclipse和交叉编译时,它的工作非常完美,因为我已经在GCC C++编译器中设置了“-I/UR/ARM Linux GNUEABI/INCOR/C++/4.7.3- O0-G3-WALLU-C++消息长度=0”和GCC C++链接路径的编译设置。“-L/usr/arm-linux-gnueabi/lib-lcurl-Wl,-b符号函数-Wl,-z,relro“。只有当我尝试使用arm-linux-gnueabi编译curl libery时,才会出现此问题。交叉编译很困难,部分原因是编译器对构建它们的环境非常敏感。我不知道您是如何获得编译器的,但关于交叉编译,我通常可以这样说:对不起,在默认情况下意外命中,交叉编译器应该使用正确的路径。与gcc一样,它将自动指向该体系结构的适当的
include
lib
目录。如果我知道你的Eclipse是如何编译这个应用程序的,可能会有所帮助。如果我不得不猜测的话,它可能是用
-L/usr/lib
显式地设置库路径,这是不好的,因为x86库就在这里。你会想把它去掉的。您是否尝试过在命令行上编译应用程序?上面提供的简单示例应该很容易编译。