OSS交叉编译的过程
记录移植OSS过程中的一些坑
交叉编译相关配置库
本篇移植工作的背景是远程升级的文件传输方式,现在主要调研了3中方式,分别是OSS、自己搭建FTP服务器和MQTT传输。由于传输文件较大,而MQTT一包只能传输64KB的数据,采用这种方式需要进行一些逻辑验证,比如缺包校验,补包的问题。故而调研OSS文件传输的方式。本文的硬件系统是ARM A8内核。
curl库安装(client URL)
该库支持FTP,FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, FILE ,LDAP等协议。
库源码参见阿里云官网下载([https://help.aliyun.com/document_detail/32132.html?spm=a2c4g.11186623.6.1102.168a23d0nqTgeB])。
./configure --prefix=/root/curl --host=arm-linux CC=/usr/local/arm_4.4.3/bin/arm-linux-gcc CXX=/usr/local/arm_4.4.3/bin/arm-linux-g++
这里简单介绍下configure后面几个参数的意义,首先–prefix 这个参数的意义是指定路径(安装后保存的路径,比如共享库等)–host 指的是目标机(我这里是arm A8)CC指的编译指令 CXX指的是g++的指令(这个我也不是特别清楚 很少用g++)
运行完这个命令后,我们就可以:
- make
- make && install
安装apr库
下载地址参考上面 curl的阿里云官网。
- 执行configure 命令 配置交叉编译
./configure --prefix=/root/apr-1/ --host=arm-linux CC=/usr/local/arm_4.4.3/bin/arm-linux-gcc CXX=/usr/local/arm_4.4.3/bin/arm-linux-g++ ac_cv_file__dev_zero=yes ac_cv_func_setpgrp_void=yes apr_cv_process_shared_works=yes apr_cv_mutex_robust_shared=yes apr_cv_tcp_nodelay_with_cork=yes ap_void_ptr_lt_long=no
前面的配置几乎和curl一样。后面的也是一些配置文件(ps 我也是跟阿里小哥看的)
这里我出现一个错误:
./include/apr_want.h:94:8: error: redefinition of ‘struct iovec’
这个结构体重复定义了,我们把它注释掉即可;
注释或者将#if 0也可以
2.执行make命令,进行编译,如显示以下错误,则继续执行以下操作。如没有报错,则执行make install命令。
encoding/apr_escape.c:79:33: error: ‘test_char_table’ undeclared
tools/gen_test_char > include/private/apr_escape_test_char.h
/bin/bash: tools/gen_test_char: cannot execute binary file: Exec format error
3.依次执行如下命令,生成当前平台运行的gen_test_char。
gcc -Wall -O2 -DCROSS_COMPILE tools/gen_test_char.c -s -o gen_test_char
./gen_test_char > include/private/apr_escape_test_char.h
我理解这里是在宿主机的编译环境下生成工具链,然后关联。
4.修改当前目录下的MakeFile,禁止自动生成(交叉编译生成新的)gen_test_char。
ps:图是盗阿里小哥的 自己安装时有些图没截。
然后
- make
- make && make install
##安装expat库
1.直接安装apr-util库会出现以下错误。因为缺少XML的解析器,所以需要先安装expat。
xml/apr_xml.c:35:19: fatal error: expat.h: No such file or directory#include <expat.h>
2.安装包直接官网下载(GitHub下载源码包)
tar xzvf xpat-2.2.5.tar
cd xpat-2.2.5
3.执行如下命令,配置expat库
./configure --prefix=/root/expat --host=arm-linux CC=/usr/local/arm_4.4.3/bin/arm-linux-gcc CXX=/usr/local/arm_4.4.3/bin/arm-linux-g++
这里路径可以用which arm-linux-gcc 搜索下。
4.make && make install
##安装libmxml库
执行如下命令,解压libmxml包。
tar zvxf mxml-0.9.1.tar.gz
执行如下命令,进入指定目录。
cd lmxml-0.9.1/
执行如下命令,创建libmxml目录。
mkdir /root/lmxml
执行如下命令,安装mxml。
./configure --prefix=/root/mxml --host=arm-linux CC=/usr/local/arm_4.4.3/bin/arm-linux-gcc CXX=/usr/local/arm_4.4.3/bin/arm-linux-g++
执行make,我们会发现报错;
./testmxml: 1: ./testmxml: Syntax error: word unexpected (expecting “)”)
Makefile:352: recipe for target ‘testmxml’ failed
make: * [testmxml] Error 2
参考CSDN的解决办法:“该报错可以忽略,所以我们直接把so和h文件复制走,并建立mxml下面把 include 和lib复制到/root/mxml 供oss_c_sdk使用即可。”验证确实可行。
这里mxml还有一个需要注意的事项:就是mxml版本不能是最新版本,建议使用2.90或者2.80 我这边最开始使用的是最新版本 会出现xml的报错,具体错误类型没有截图了。
编译
oss_C_SDK
最后就是oss_C_SDK 的安装和交叉编译。
1.首先解压安装包,这个比较简单不多说了
tar xvf aliyun-oss-c-sdk-3.5.0.tar.gz
cd aliyun-oss-c-sdk-3.5.0
2.编辑CMakeList.txt文件,在文件开头添加交叉编译器的寻找位置
SET(CMAKE_SYSTEM_NAME Linux)
SET(TOOLCHAIN_DIR "/usr/local/arm_4.4.3/")//交叉编译的工具链的位置
SET(CMAKE_SYSTEM_PROCESSOR MIPS)
SET(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_DIR}
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
SET(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/bin/arm-linux-gcc)//添加gcc编译路劲
SET(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/bin/arm-linux-g++)//添加g++的编译路径
3.添加寻找相关库的路径
FIND_PROGRAM(APR_CONFIG_BIN NAMES apr-config apr-1-config PATHS /home/aliOSS/osssdk/apr/bin /usr/bin /usr/local/bin /usr/local/apr/bin/)
FIND_PROGRAM(APU_CONFIG_BIN NAMES apu-config apu-1-config PATHS /home/aliOSS/osssdk/apr-util/bin /usr/bin /usr/local/bin /usr/local/apr/bin/)
接着向下走 #curl-config时添加
FIND_PROGRAM(CURL_CONFIG_BIN NAMES curl-config PATH /home/aliOSS/osssdk/apr-utilcurl/bin )
4.删除最后两行关于test 和sample这两个编译。
5.Cmake
cmake . -DCMAKE_INSTALL_PREFIX=/root/oss_c_sdk
-DCURL_INCLUDE_DIR=/root/curl/include/
-DCURL_LIBRARY=/root/curl/lib/libcurl.a
-DAPR_INCLUDE_DIR=/root/apr-1/include/apr-1/
-DAPR_LIBRARY=/root/apr-1/lib/libapr-1.a
-DAPR_UTIL_INCLUDE_DIR=/root/apr-util/include/apr-1
-DAPR_UTIL_LIBRARY=/root/apr-util/lib/libaprutil-1.a -DMINIXML_INCLUDE_DIR=/root/libmxml/include/
-DMINIXML_LIBRARY=/root/libmxml/lib/libmxml.a
-DPTHREAD_LIBRARY=/usr/local/arm_4.4.3/arm-none-linux-gnueabi/sys-root/usr/lib/libpthread.a
-DMATH_LIBRARY=/usr/local/arm_4.4.3/arm-none-linux-gnueabi/sys-root/usr/lib/libm.a -DRT_LIBRARY=/usr/local/arm_4.4.3/arm-none-linux-gnueabi/sys-root/usr/lib/librt.a
这里根据编译链的路径和安装库路径的位置修改上述命令即可。
然后就是
make
make install
交叉编译部分已经完成了。下一篇介绍使用oss过程中的一些坑。