arm_linux交叉编译开发环境建立之 - thrift

thrift arm_linux交叉编译环境搭建

1 linux主机thrift环境

linux: Ubuntu 16.04

2 依赖的软件包

sudo apt-get install automake
sudo apt install bison
sudo apt install flex
sudo apt install libboost1.58-all-dev
sudo apt install libevent-dev
sudo apt install libssl-dev
sudo apt install pkg-config

3 build host thrift

下载源码:
wget http://archive.apache.org/dist/thrift/0.9.3/thrift-0.9.3.tar.gz
tar -pxzf thrift-0.9.3.tar.gz

./configure --prefix=/usr/local/thrift --without-java --without-php --without-python
make
sudo make install

4 build arm thrift

需要交叉编译依赖包:
boost1.58
libevent2.0.22
openssl1.0.2l
automake1.15(有版本错误提示说需要 aclocal1.14,需要改掉脚本里面判断脚本的位置,改成1.15。因为1.14无法使用)

4.1 build boost for arm

需要的依赖包:
apt-get install libicu-dev  #支持正则表达式的UNICODE字符集
apt-get install python-dev
apt-get install libbz2-dev #如果编译出现错误:bzlib.h: No such file or directory (这个错误很难搞)
拷贝bzlib.h 到./libs/iostreams/src/目录下
下载boost源码:
wget https://sourceforge.net/projects/boost/files/boost/1.58.0/boost_1_58_0.tar.bz2/download
tar -pxjf boost_1_58_0.tar.bz2
cd boost_1_58_0.tar.bz2
运行:
(1)执行 ./bootstrap.sh
(2)修改生成的 project-config.jam 如下:
using gcc : arm : arm-linux-gcc ;
注意:上面的空格必须要有。
if ! gcc in [ feature.values ]
{
using gcc : arm : arm-linux-gcc ;
}
修改如下:

# These settings are equivivalent to corresponding command-line
# options.
option.set prefix : /usr/local/arm/4.8.2 ;
option.set exec-prefix : /usr/local/arm/4.8.2/bin ;
option.set libdir : /usr/local/arm/4.8.2/lib ;
option.set includedir : /usr/local/arm/4.8.2/include ;

(3)./bjam stage --layout=tagged --build-type=complete link=shared runtime-link=shared threading=multi --without-python

stage/install:stage表示只生成库(dll和lib),install还会生成包含头文件的include目录。推荐使用stage,因为install生成的这个include目录实际就是boost安装包解压缩后的boost目录(/arm-linux/src/thrift-arm/boost_1_58_0/boost,只比include目录多几个非hpp文件,都很小),所以可以直接使用,而且不同的IDE都可以使用同一套头文件,这样既节省编译时间,也节省硬盘空间。

toolset:指定编译器,可选的如borland、gcc、msvc(VC6)、msvc-9.0(VS2008)等。
–without/with:选择不编译/编译哪些库。因为python、mpi等库我都用不着,所以排除之。还有wave、graph、math、regex、test、program_options、serialization、signals这几个库编出的静态lib都非常大,所以不需要的也可以without掉。默认是全部编译。但是需要注意,如果选择编译python的话,是需要python语言支持的,应该到python官方主页http://www.python.org/下载安装。查看boost包含库的命令是bjam --show-libraries。

stagedir/prefix:stage时使用stagedir,install时使用prefix,表示编译生成文件的路径。

build-dir:编译生成的中间文件的路径。默认就在根目录(/arm-linux/src/thrift-arm/boost_1_58_0/)下,目录名为bin.v2,等编译完成后可将这个目录全部删除,所以不需要去设置。

link:生成动态链接库/静态链接库。生成动态链接库需使用shared方式,生成静态链接库需使用static方式。

runtime-link:动态/静态链接C/C++运行时库。同样有shared和static两种方式,这样runtime-link和link一共可以产生4种组合方式,各人可以根据自己的需要选择编译。一般link只选static的话,只需要编译2种组合即可,即link=static runtime-link=shared和link=static runtime-link=static。

threading:单/多线程编译。如果是多线程程序需要指定multi方式。
debug/release:编译debug/release版本。

4.2 build libevent for arm

wget https://github.com/libevent/libevent/releases/download/release-2.0.22-stable/libevent-2.0.22-stable.tar.gz
tar -pxzf libevent-2.0.22-stable.tar.gz
cd libevent-2.0.22-stable
./configure --prefix=/usr/local/arm/libevent --host=arm-linux CC=arm-linux-gcc CXX=arm-linux-g++
make
sudo make install

4.3 build openssl for arm

wget https://www.openssl.org/source/openssl-1.0.2l.tar.gz
tar -pxzf openssl-1.0.2l.tar.gz
cd openssl-1.0.2l
./config no-asm shared --prefix=/usr/local/arm/arm-openssl --openssldir=/usr/local/arm/arm-openssl --cross-compile-prefix=arm-linux-

修改Makefile中:
CC = arm-linux-gcc
AR = arm-linux-ar
RANLIB = arm-linux-ranlib
然后,:

make
sudo make install

常见错误:
(1)‘OSSL_SSIZE_MAX’ undeclared(使用版本1.1.0 出现此错误)
修改源码:include/openssl/e_os2.h 里面的这一部分改成这个样子:

# ifndef ossl_ssize_t
#  define ossl_ssize_t ssize_t
#  if defined(SSIZE_MAX)
#   define OSSL_SSIZE_MAX SSIZE_MAX
#  elif defined(_POSIX_SSIZE_MAX)
#   define OSSL_SSIZE_MAX _POSIX_SSIZE_MAX
/***  新增部分:开始 ***/
#  elif(__WORDSIZE == 64)              
#   define OSSL_SSIZE_MAX LONG_MAX
#  elif(__WORDSIZE == 32)
#   define OSSL_SSIZE_MAX INT_MAX    
/***  新增部分:结束 ***/
#  endif
# endif

(2)如果在Linux下安装openssl,执行config和make之后,在执行make install时如果出现下面的错误
cms.pod around line 457: Expected text after =item, not a number
cms.pod around line 461: Expected text after =item, not a number
cms.pod around line 465: Expected text after =item, not a number
cms.pod around line 470: Expected text after =item, not a number
cms.pod around line 474: Expected text after =item, not a number
POD document had syntax errors at /usr/bin/pod2man line 69.
则在root权限下,执行sudo mv /usr/bin/pod2man /usr/bin/pod2man_bak 然后重新make install
完成 install后,再把这个文件恢复回来。

sudo mv /usr/bin/pod2man_bak /usr/bin/pod2man

4.4 build zlib for arm

zlib-1.2.11

export CC=arm-linux-gcc
./configure --prefix=/usr/local/arm/zlib
make
sudo make install

4.5 build thrift for arm

重新解压一份源码:

mkdir thrift-arm
tar -pxzf thrift-0.9.3.tar.gz -C src/thrift-arm

thrift arm环境下缺少一个 limits.h 文件:

cp /usr/include/limits.h thrift/compiler/cpp/src 目录下

设置QtCore.pc 的路径:

export PKG_CONFIG_PATH=/usr/local/worksch/qt486-arm/lib/pkgconfig

编辑 configure.ac 文件,删除里面的2行:

AC_FUNC_MALLOC
AC_FUNC_REALLOC

然后:

autoconf
export PKG_CONFIG_PATH=/usr/local/worksch/qt486-arm/lib/pkgconfig
./configure --target=arm-linux --host=arm-linux --prefix=/usr/local/arm/thrift --with-boost=/home/haojc/arm-linux/src/thrift-arm/boost_1_58_0/stage --with-libevent=/usr/local/arm/libevent --with-openssl=/usr/local/arm/arm-openssl LDFLAGS="-L/home/haojc/arm-linux/src/thrift-arm/boost_1_58_0/stage/lib -L/usr/local/arm/libevent/lib -lcrypto -L/usr/local/arm/arm-openssl/lib -L/usr/local/arm/zlib/lib" LIBS="-ldl" CXXFLAGS="-I/home/haojc/arm-linux/src/thrift-arm/boost_1_58_0 -I/usr/local/arm/arm-openssl/include -I/usr/local/arm/libevent/include -I/usr/local/arm/4.8.2/arm-linux-gnueabi/include -I/usr/local/arm/4.8.2/include -I/usr/local/arm/zlib/include" --enable-tests=no --with-qt4=yes --with-qt5=no QT_LIBS="-L/usr/local/worksch/qt486-arm/lib" --with-zlib=/usr/local/arm/zlib

make
sudo make install

常见问题:
(1)如果报缺少 aclocal 1.14,automake 1.14,就修改脚本里面判断脚本的地方。用automake 2.15 才可以。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值