我在x86上尝试交叉编译用C ++编写的armhf的apache thrift程序。我通过gcc-arm-linux-gnueabihf
安装了g++-arm-linux-gnueabihf
和apt-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
PS。我正在为使用armhf的Beaglebone Black进行交叉编译
答案 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#...)。