交叉编译移植阿里云OSS C SDK

目录

1 说明

2 特别说明

3 交叉编译移植

3.1 说明

3.2 全局变量设置

3.3 移植openssl-1.0.2t

3.4 移植zlib-1.2.11

3.5 移植curl-7.67.0

3.6 移植apr-1.7.0

3.7 移植expat-2.1.0

3.8 移植apr-util-1.6.1

3.9 移植mxml-2.8

3.10 移植libuuid-1.0.3

3.11 移植aliyun-oss-c-sdk

3.12 统一打包成一个库


1 说明

阿里云OSS类似于网盘的功能,需要和阿里云签订商业协议才能存储大量的数据,所以如果和它们没有业务往来可以忽略本文内容。本文内容主要来自移植OSS C语言SDK(它还有其他语言的SDK)的经验。

2 特别说明

作者在移植成功之后,在(Ubuntu 1604上)运行过程中发现调用断点续传上传、断点续传下载、分片上传、追加上传的业务函数会出现内存泄漏最终出现OOM。当时(2020年12月)对方技术支持说相对于C他们主要是推广C++版本的,推荐我们用C++的(当然我们也没有用C++版本,所以不知道C++版本的情况),现在有没有修复这些问题作者目前还没有验证。下列几张图是说明断点续传上传时的内存情况(虚拟内存占用越来越大)。

交叉编译移植阿里云OSS C SDK_第1张图片

交叉编译移植阿里云OSS C SDK_第2张图片

交叉编译移植阿里云OSS C SDK_第3张图片

3 交叉编译移植

3.1 说明

本文提到的依赖软件包可以在百度网盘中找到,也可以自行从各自的官网下载。

链接:https://pan.baidu.com/s/1KK8HtGcJvR38ZmEazLlU2w

提取码:nsmy

可以从https://help.aliyun.com/document_detail/32131.html?spm=5176.87240.400427.52.8f4a4614owPWLu

查看OSS的全貌。

3.2 全局变量设置

在移植其他依赖包之前请先设置全局变量,

export CC=arm-none-linux-gnueabi-gcc

export CXX=arm-none-linux-gnueabi-g++

3.3 移植openssl-1.0.2t

tar xzf openssl-1.0.2t.tar.gz

cd openssl-1.0.2t

setarch i386 ./config no-asm --static --prefix=/home/lijun_temp/install_tmp

将crypto/buffer/buffer.c改名为crypto_buffer.c,更改crypto/buffer/Makefile,将其中的buffer.c、buffer.o改为crypto_buffer.c、crypto_buffer.o

make,成功之后可以找到libssl.a、libcrypto.a

make install

3.4 移植zlib-1.2.11

tar xJf zlib-1.2.11.tar.xz

cd zlib-1.2.11/

./configure --static --prefix=/home/lijun_temp/install_tmp

make,成功之后可以找到libz.a

make install

3.5 移植curl-7.67.0

tar xzf curl-7.67.0.tar.gz

cd curl-7.67.0/

./configure --prefix=/home/lijun_temp/install_tmp --with-ssl=/home/lijun_temp/install_tmp --enable-shared=no --with-zlib=/home/lijun_temp/install_tmp --host=arm-none-linux-gnueabi --build=armv7 CPPFLAGS="-I/home/lijun_temp/install_tmp/include/openssl -I/home/lijun_temp/install_tmp/include" LDFLAGS="-L/home/lijun_temp/install_tmp/lib"

make,成功之后可以找到libcurl.a

make install

3.6 移植apr-1.7.0

tar xzf apr-1.7.0.tar.gz

cd apr-1.7.0/

先在PC-linux编译一次

创建arm-none-linux-gnueabi.cache,添加如下两行内容

apr_cv_process_shared_works=yes

apr_cv_mutex_robust_shared=yes

export CC=""

export CXX=""

./configure

make,成功之后可以找到gen_test_char,将它拷贝到其他路径并保存起来(cp ./tools/gen_test_char /home/lijun_temp/)

重新交叉编译一次

export CC=arm-none-linux-gnueabi-gcc

export CXX=arm-none-linux-gnueabi-g++

rm -rf apr-1.7.0 && sync

tar xzf apr-1.7.0.tar.gz

cd apr-1.7.0/

创建arm-none-linux-gnueabi.cache,添加如下两行内容

apr_cv_process_shared_works=yes

apr_cv_mutex_robust_shared=yes

./configure --prefix=/home/lijun_temp/install_tmp --host=arm-none-linux-gnueabi --build=armv7 ac_cv_file__dev_zero=yes ac_cv_func_setpgrp_void=yes apr_cv_tcp_nodelay_with_cork=yes --cache=arm-none-linux-gnueabi.cache

vim ./include/apr_want.h +95,将struct iovec定义的地方注释掉,如下所示:

#if 0

struct iovec

{

void *iov_base;

size_t iov_len;

};

#endif

将原先保存起来的gen_test_char复制到tools目录下(cp ../gen_test_char /home/lijun_temp/apr-1.7.0/tools)

vim ./include/apr.h +255,将APR_HAS_PROC_PTHREAD_SERIALIZE定义为1,如下所示:

#define APR_HAS_PROC_PTHREAD_SERIALIZE    1

将locks/unix/proc_mutex.c的823行的pthread_mutex_consistent改为pthread_mutex_consistent_np,将locks/unix/proc_mutex.c的630行的pthread_mutexattr_setrobust改为pthread_mutexattr_setrobust_np

make,成功之后可以找到libapr-1.a

make install

3.7 移植expat-2.1.0

tar xzf expat-2.1.0.tar.gz

cd expat-2.1.0/

./configure --host=arm-none-linux-gnueabi --prefix=/home/lijun_temp/install_tmp --enable-shared=no

make,成功之后可以找到libexpat.a

make install

3.8 移植apr-util-1.6.1

tar xzf apr-util-1.6.1.tar.gz

cd apr-util-1.6.1/

./configure --host=arm-none-linux-gnueabi --prefix=/home/lijun_temp/install_tmp --with-apr=/home/lijun_temp/install_tmp  --with-expat=/home/lijun_temp/install_tmp

make,成功之后可以找到libaprutil-1.a

make install

3.9 移植mxml-2.8

tar xzf mxml-2.8.tar.gz

cd mxml-2.8/

./configure --host=arm-none-linux-gnueabi --prefix=/home/lijun_temp/install_tmp

make,生成了libmxml.a,同时报错如下:

Compiling testmxml.c

Linking testmxml...

Testing library...

make: *** [testmxml] 错误 2

忽略上述错误,将mxml.h拷贝到安装路径下(cp mxml.h /home/lijun_temp/install_tmp/include/mxml.h),将库文件拷贝到安装路径下(cp libmxml.a /home/lijun_temp/install_tmp/lib/libmxml.a)

3.10 移植libuuid-1.0.3

tar xzf libuuid-1.0.3.tar.gz

cd libuuid-1.0.3

./configure --host=arm-none-linux-gnueabi --prefix=/home/lijun_temp/install_tmp

make,成功之后可以找到libuuid.a

make install

3.11 移植aliyun-oss-c-sdk

export CC=arm-none-linux-gnueabi-gcc

export CXX=arm-none-linux-gnueabi-g++

cmake . -DCMAKE_INSTALL_PREFIX=/home/lijun_temp/install_tmp/ -DCURL_INCLUDE_DIR=/home/lijun_temp/install_tmp/include/curl/ -DCURL_LIBRARY="/home/lijun_temp/install_tmp/lib/libcurl.a"  -DAPR_INCLUDE_DIR=/home/lijun_temp/install_tmp/include/apr-1/ -DAPR_LIBRARY=/home/lijun_temp/install_tmp/lib/libapr-1.a  -DAPR_UTIL_LIBRARY=/home/lijun_temp/install_tmp/lib/libaprutil-1.a -DMINIXML_INCLUDE_DIR=/home/lijun_temp/install_tmp/include -DMINIXML_LIBRARY=/home/lijun_temp/install_tmp/lib/libmxml.a -DPTHREAD_LIBRARY=/usr/local/arm/4.4.1/arm-none-linux-gnueabi/libc/usr/lib/libpthread.so  -DMATH_LIBRARY=/usr/local/arm/4.4.1/arm-none-linux-gnueabi/libc/usr/lib/libm.so

make,生成liboss_c_sdk_static.a

3.12 统一打包成一个库

基本思路就是先将所有的.a解包出多个.o,然后将所以的.o打包成一个.a。

mkdir /home/lijun_PC_temp/temp,将上述生成的.a文件全部拷入其中。

cd /home/lijun_PC_temp/temp

ar x libcrypto.a

ar x libssl.a

ar x libz.a

ar x libcurl.a

ar x libapr-1.a

ar x libexpat.a

ar x libmxml.a

ar x libaprutil-1.a

ar x liboss_c_sdk_static.a

ar x libuuid.a

ar crsv newLib.a *.o

gcc oss_listBucket.c newLib.a -o oss_listBucket -I/home/lijun_PC_temp/install_tmp/include/ -I/home/lijun_PC_temp/install_tmp/include/apr-1/ -lrt -lpthread -ldl

oss_listBucket.c可以通过“说明”章节提到的官方网址下载。

你可能感兴趣的:(Linux,linux)