欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

OSS交叉编译的过程

程序员文章站 2022-07-10 18:06:46
...

交叉编译相关配置库

本篇移植工作的背景是远程升级的文件传输方式,现在主要调研了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++)

运行完这个命令后,我们就可以:

  1. make
  2. make && install

安装apr库

下载地址参考上面 curl的阿里云官网。

  1. 执行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’

这个结构体重复定义了,我们把它注释掉即可;

OSS交叉编译的过程
注释或者将#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。
OSS交叉编译的过程
ps:图是盗阿里小哥的 自己安装时有些图没截。

然后

  1. make
  2. 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过程中的一些坑。

相关标签: oss