目录
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 统一打包成一个库
阿里云OSS类似于网盘的功能,需要和阿里云签订商业协议才能存储大量的数据,所以如果和它们没有业务往来可以忽略本文内容。本文内容主要来自移植OSS C语言SDK(它还有其他语言的SDK)的经验。
作者在移植成功之后,在(Ubuntu 1604上)运行过程中发现调用断点续传上传、断点续传下载、分片上传、追加上传的业务函数会出现内存泄漏最终出现OOM。当时(2020年12月)对方技术支持说相对于C他们主要是推广C++版本的,推荐我们用C++的(当然我们也没有用C++版本,所以不知道C++版本的情况),现在有没有修复这些问题作者目前还没有验证。下列几张图是说明断点续传上传时的内存情况(虚拟内存占用越来越大)。
本文提到的依赖软件包可以在百度网盘中找到,也可以自行从各自的官网下载。
链接:https://pan.baidu.com/s/1KK8HtGcJvR38ZmEazLlU2w
提取码:nsmy
可以从https://help.aliyun.com/document_detail/32131.html?spm=5176.87240.400427.52.8f4a4614owPWLu
查看OSS的全貌。
在移植其他依赖包之前请先设置全局变量,
export CC=arm-none-linux-gnueabi-gcc
export CXX=arm-none-linux-gnueabi-g++
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
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
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
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
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
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
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)
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
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
基本思路就是先将所有的.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可以通过“说明”章节提到的官方网址下载。