为armhf交叉编译Apache Thrift程序

时间:2013-07-23 00:47:21

标签: cross-compiling thrift beagleboard

我在x86上尝试交叉编译用C ++编写的armhf的apache thrift程序。我通过gcc-arm-linux-gnueabihf安装了g++-arm-linux-gnueabihfapt-get,但是当我使用它们来编译我的程序时,我得到了

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,但它仍然无法正常工作。展望节俭的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。这真的是最好的方法吗,还是有更快/更简单的方法?

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

2 个答案:

答案 0 :(得分:7)

在我的系统上,我通过运行以下命令安装libfl,这应该比手动交叉编译flex更容易。

sudo xapt -a armhf -m libfl-dev

为了解决cannot run test program while cross compiling问题,您可以通过将--without-libevent传递给configure来构建Thrift而不需要libevent支持(如果这是一个选项),或者您可以修改将aclocal/ax_lib_event.m4替换为AC_RUN_IFELSE使用AC_LINK_IFELSE。请注意,除非您将aclocal/ax_lib_zlib.m4传递给--without-zlib,否则您必须在configure中进行类似的更改。修改autoconf中的文件后,请不要忘记运行aclocal

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

  

/ usr / arm-linux-gnueabihf / include / c ++ / 4.6.3 / cstdlib:119:11:错误:':: malloc'尚未声明   /usr/arm-linux-gnueabihf/include/c++/4.6.3/cstdlib:127:11:错误:':: realloc'尚未声明

IMO,解决此问题的最简单方法是从configure.ac删除以下行:

AC_FUNC_MALLOC
AC_FUNC_REALLOC

同样,您必须在删除autoconf中的行后运行configure.ac

最后,您可以使用所选的选项重新运行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支持,我建议您也这样做以简化构建。

答案 1 :(得分:2)

Thrift 0.9.0因交叉编译而中断 - 它在Autoconf测试脚本中有很多静态路径。

他们的Jira上有一个关于这个主题的错误,但事情并没有取得很大进展(基本上问我是否设置了所有内容的--includedir ...(提示:交叉编译不使用你在Autotools配置上随意乱搞 - 他们应该做的第一件事是去寻找主机的固定路径))

你无法关闭PHP构建,这比这更加困难。惭愧,真的,我有点需要一站式服务,谷歌和整个社区都放弃了这个(RPC是一个笑话......有多少不同的实施 - 而且没有一个支持C /兼容C ++ / Python / C#...)。