将Apache Thrift程序交叉编译为armhf

4

我正在x86上尝试交叉编译一个用C ++编写的apache thrift程序到armhf。我通过apt-get安装了gcc-arm-linux-gnueabihfg++-arm-linux-gnueabihf,但是当我使用它们来编译我的程序时,我得到了以下错误:

skipping incompatible /usr/local/lib/libthrift.so when searching for -lthrift

于是我尝试按照this guide配置thrift以编译一个与armhf兼容的libthrift.so,在bash中运行:

./configure CXX=arm-linux-gnueabihf-g++ CC=arm-linux-gnueabihf-gcc --prefix=/BBB/thrift --host=arm-linux-gnueabihf --with-cpp CFLAGS="-g -O2 -I$DIR/include" LDFLAGS="-L$DIR/lib

但是我得到了以下错误:

checking for libevent >= 1.0... configure: error: in 'home/xic/thrift-0.9.0': configure: error: cannot run test program while cross compiling

于是我成功编译了libevent,但它仍然无法工作。查看Thrift的config.log,我发现:

/usr/lib/gcc/arm-linux-gnueabihf/4.6/../../../../arm-linux-gnueabihf/bin/ld: cannot find -lfl collect2: ld returned 1 exit status

显然,我还需要交叉编译flex。这真的是最好的方法吗?还是有更快/更容易的方法?

附:我正在为使用armhf的Beaglebone Black进行交叉编译。

2个回答

8
在我的系统上,我通过运行以下命令安装了libfl,这应该比手动交叉编译flex更容易。
sudo xapt -a armhf -m libfl-dev

为了解决“交叉编译时无法运行测试程序”的问题,您可以通过在configure中传递--without-libevent来构建不带libevent支持的Thrift(如果这是一个选项),或者通过将aclocal/ax_lib_event.m4中使用的AC_RUN_IFELSE替换为AC_LINK_IFELSE来修改它。请注意,除非您在configure中传递--without-zlib,否则您还必须在aclocal/ax_lib_zlib.m4中进行类似的更改。在修改aclocal文件后,不要忘记运行autoconf

进行这些更改后,您可能会遇到以下编译错误:

/usr/arm-linux-gnueabihf/include/c++/4.6.3/cstdlib:119:11: error: '::malloc' has not been declared /usr/arm-linux-gnueabihf/include/c++/4.6.3/cstdlib:127:11: error: '::realloc' has not been declared

我认为最简单的修复方法是从configure.ac中删除以下行:

AC_FUNC_MALLOC
AC_FUNC_REALLOC

再次,在从configure.ac中删除这些行之后,您需要运行autoconf
最后,您可以使用所选的选项重新运行configure。 在我的系统上,我运行了:
./configure --host=arm-linux-gnueabihf --with-cpp --without-tests \
   --without-qt4 --without-c_glib --without-ruby --without-python

您需要使用--without-tests选项,以避免构建尝试在x86构建机上运行armhf测试二进制文件时出现问题。
我传递了其余的--without-*选项,以避免安装额外的依赖项。如果您不需要QT、Glib、Ruby和Python支持,我建议您也这样做,以简化构建过程。

3
最新的节俭方法是关闭测试,命令为 --enable-tests=no - wilbeibi
当我尝试这样做的时候,--without-tests选项并没有正常工作。根据@wilbeibi的说法,他们在更新的版本中修复了这个问题。 - Svartalf

3
Thrift 0.9.0在交叉编译方面存在问题- Autoconf测试脚本中有大量静态路径。他们的Jira上有关于此问题的错误报告,但事情没有进展得很远(基本上是在问我是否设置了--includedir...(提示:交叉编译不会在Autotools配置上进行调整,他们应该首先去寻找主机上的固定路径))。你无法关闭PHP构建,这会导致更进一步的问题。真是遗憾,我需要一个一站式解决方案,但Google和社区都没有解决这个问题(RPC是一个笑话...有多少不同的实现,而且没有一个同时支持C/C++/Python/C#的兼容性...)。

谢谢。最终我在Beaglebone上进行了本地编译,但由于Apache网站没有提供opkg的软件包名称(他们使用apt-get),所以我不得不逐个搜索它们。RPC文档严重缺乏... - woojoo666
是的,他们最近才开始解决跨编译方面的问题(如果他们不再使用Autotools就好了...叹气...),根据我最近收到的关于我提交的错误报告的电子邮件,在过去的三周内至少解决了部分混乱。它有潜力,但它没有得到它所需要的关注,包括文档。 - Svartalf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接