2010年10月22日星期五

几个第三方库的交叉编译

交叉编译环境根目录在/usr/coma/v4t_le
编译器: /usr/coma/v4t_le/bin
目标运行环境及库: /usr/coma/v4t_le/target /usr/coma/v4t_le/target/usr/lib

在执行交叉编译之前,先设置2个环境变量:
export CC=/usr/coma/v4t_le/bin/arm_v4t_le-gcc
export CXX=/usr/coma/v4t_le/bin/arm_v4t_le-g++

expat-2.0.1
libarchive-2.5.5
这两个库的交叉编译没有什么麻烦,进入到源文件路径后:
./configure --host=arm4tl-hardhat-linux --prefix=/opt/coma/v4t_le/target/usr
make
make install
执行这三个命令就基本好了。

zlib-1.2.5 更简单,
./configure --prefix=/opt/coma/v4t_le/target/usr|
make
make install

OpenSSL的交叉编译相对麻烦:(Reference: Linux下第三方库交叉编译 - lee353086的专栏 - CSDN博客.)
#openssl版本0.9.8o
方式一:生成静态库
# ./config --prefix=/home/kagula/arm432 no-asm shared os/compiler:arm-linux-gcc
修改MakeFile文件中的以下变量
EX_LIBS= -ldl
AR= arm-linux-ar $(ARFLAGS) r
ARD=arm-linux-ar $(ARFLAGS) d
RANLIB= arm-linux-ranlib
#Make
#Make install
生成libssl.a libcrytpo.a (这两个库的使用顺序不能颠倒)
(把arm-linux-ar 要换成你的交叉编译器对应的文件名:
我这里是/opt/coma/v4t_le/bin/arm_v4t_le-ar
相应的arm-linux-ranlib 也要替换为/opt/coma/v4t_le/bin/arm_v4t_le-ranlib。)
备注:【1】使用os/compiler选项会导致shared参数不起作用,即只能生成静态库【2】如果刚编译成x86版本的,编译成arm版本之前记得要make clean下清除掉x86版本的目标文件。
方式二:生成动态库
#CC=arm-linux-gcc ./config no-asm shared --prefix=/home/kagula/arm432
如上修改MakeFile文件中的变量
#Make
#Make install
在安装目录就会看到libssl.so及libcrypto.so相关文件

gSoap
这个包的交叉编译是最麻烦的,在尝试过程中(由于环境的不同)你可能会发现需要一些其它的第三方包,比如Bison, Flex,M4,甚至需要在/usr/lib下建立一个libssl.so的软链接。另外比较特殊的是,你需要一个现在宿主机上编译一个本地的gsoap库,因为在交叉编译wsdl目录下文件是,需要执行gsoapcpp2,而目标平台的gsoapcpp2是不可能在宿主机行执行的。所以,还需要修改wsdl里的Makefile文件重新修改SOAP的值为: SOAP=soapcpp2 。 当然soapcpp2需要在你的宿主机环境的PATH里。

问题1: 交叉编译gsoap的时候总出现'malloc' has not been declared 的错误。在网上查了下,是因为cstdlib的一个库bug。
1. 将#define malloc rpl_malloc 屏蔽;
2.将#define HAVE_MALLOC 0 更改为:#define HAVE_MALLOC 1

问题2: “找不到yacc”的问题。Bison是优于yacc的方案:http://www.gnu.org/software/bison/

问题3: ./congifugre bison有说需要GNU M4 1.4.13 。 M4主页:http://www.gnu.org/software/m4/

问题4:还需要GNU Flex http://flex.sourceforge.net/ 这个需要安装到宿主机环境。

问题5:不能执行soapcpp2。 解决办法:在宿主机上编译一个本地的gsoap库。