linux: Ubuntu 16.04
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
下载源码:
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
需要交叉编译依赖包:
boost1.58
libevent2.0.22
openssl1.0.2l
automake1.15(有版本错误提示说需要 aclocal1.14,需要改掉脚本里面判断脚本的位置,改成1.15。因为1.14无法使用)
需要的依赖包:
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版本。
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
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
zlib-1.2.11
export CC=arm-linux-gcc
./configure --prefix=/usr/local/arm/zlib
make
sudo make install
重新解压一份源码:
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 才可以。