4

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

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

所以我尝试使用本指南配置 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's 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 进行交叉编译

4

2 回答 2

8

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

sudo xapt -a armhf -m libfl-dev

为了解决这个cannot run test program while cross compiling问题,您可以通过传递--without-libevent给来构建不支持 libevent 的 Thrift(如果这是您的选择) configure,或者您可以aclocal/ax_lib_event.m4通过替换使用AC_RUN_IFELSEwith来修改AC_LINK_IFELSE。请注意,aclocal/ax_lib_zlib.m4除非您传递--without-zlibconfigure. 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 支持,我建议您这样做以简化构建。

于 2013-08-16T18:31:09.767 回答
3

Thrift 0.9.0 无法进行交叉编译——它在 Autoconf 测试脚本中有大量静态路径。

他们的 Jira 中有一个关于这个主题的错误,但事情进展并不很远(基本上是问我是否设置了所有东西的 --includedir ......(提示:交叉编译不会让你到处乱吃在 Autotools 配置上,他们应该做的第一件事就是寻找主机的固定路径))

您不能关闭比这更糟的 PHP 构建。很遗憾,真的,我有点需要为此提供一站式服务,而谷歌和整个社区已经放弃了这一点(RPC 是个笑话......有多少不同的实现——而且它们都不支持 C/同时兼容 C++/Python/C#...)。

于 2013-08-17T22:33:22.913 回答