一、简介
OSS可用于图片、音视频、日志等海量文件的存储,详见阿里云OSS。
嵌入式设备Linux系统下需要移植oss c-sdk到设备端运行,这里以君正T41平台为例,所需依赖库:
- openssl:支持https
- curl:解决网络方面的问题
- apr、apr-util:解决内存管理以及跨平台问题
- minixml:解析请求返回的xml
二、openssl库
下载地址:https://www.openssl.org/source/
这里下载的是 openssl-3.0.9.tar.gz
1. 解压压缩包
#解压
tar -zxvf openssl-3.0.9.tar.gz
#进入解压目录
cd openssl-3.0.9/
2. 编译配置
#配置编译
./config --prefix=/home/zdw/aliyun_oss2/osssdk/ssl --cross-compile-prefix=mips-linux-uclibc- no-asm shared no-async linux-mips32
#--prefix 安装目录,后面需要将这个目录生成的库文件拷贝到设备端
#--cross-compile-prefix=mips-linux-uclibc- 交叉编译链
#linux-mips32: 其对应的平台
3. 编译并安装
make -j
make install
三、curl库
下载地址:https://curl.se/download.html
这里下载的是:curl-8.1.2.tar.gz
1. 解压压缩包
tar -zxvf curl-8.1.2.tar.gz
cd curl-8.1.2/
2. 编译配置
./configure --prefix=/home/zdw/aliyun_oss2/osssdk/curl --host=mips CC=/opt/mips-gcc720-uclibc0.9.33.2-r5.1.4/bin/mips-linux-uclibc-gcc CXX=/opt/mips-gcc720-uclibc0.9.33.2-r5.1.4/bin/mips-linux-uclibc-g++ --with-ssl=/home/zdw/aliyun_oss2/osssdk/ssl --enable-static
#--prefix 安装路径
#--with-ssl 指定使用前面编译的ssl库
3. 编译并安装
make -j
make install
四、apr库
下载地址:https://apr.apache.org/download.cgi?file=download.cgi
这里下载的是:apr-1.7.4.tar.gz
1. 解压文件
tar -zxvf apr-1.7.4.tar.gz
cd apr-1.7.4/
2. 编译配置
./configure --prefix=/home/zdw/aliyun_oss2/osssdk/apr \
--host=arm-linux CC=/opt/mips-gcc720-uclibc0.9.33.2-r5.1.4/bin/mips-linux-uclibc-gcc \
CXX=/opt/mips-gcc720-uclibc0.9.33.2-r5.1.4/bin/mips-linux-uclibc-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 \
APR_HAS_PROC_PTHREAD_SERIALIZE=yes
3. 编译并安装
make -j
make install
五、apr-util库
在编译之前还需要编译libexpat 不然会出现如下错误:
xml/apr_xml.c:35:19: fatal error: expat.h: No such file or directory
#include <expat.h>
先进行libexpat库的编译
下载地址:
git clone https://github.com/libexpat/libexpat.git
配置及编译
cd expat/
./buildconf.sh
./configure --prefix=/home/zdw/aliyun_oss2/osssdk/expat --with-docbook -host=mips CC=/opt/mips-gcc720-uclibc0.9.33.2-r5.1.4/bin/mips-linux-uclibc-gcc CXX=/opt/mips-gcc720-uclibc0.9.33.2-r5.1.4/bin/mips-linux-uclibc-g++
automake
make
make install
接下来进行apr-util的编译
下载地址:https://apr.apache.org/download.cgi?file=download.cgi
这里下载的是:apr-util-1.6.3.tar.gz
1. 解压文件
tar -zxvf apr-util-1.6.3.tar.gz
cd apr-util-1.6.3/
2. 编译配置
./configure CC=/opt/mips-gcc720-uclibc0.9.33.2-r5.1.4/bin/mips-linux-uclibc-gcc CXX=/opt/mips-gcc720-uclibc0.9.33.2-r5.1.4/bin/mips-linux-uclibc-g++ --host=mips --prefix=/home/zdw/aliyun_oss2/osssdk/apr-util --with-apr=/home/zdw/aliyun_oss2/osssdk/apr --with-expat=/home/zdw/aliyun_oss2/osssdk/expat
3. 编译安装
make -j
make install
六、minixml库
下载地址:https://www.msweet.org/mxml/
这里下载的是:mxml-3.3.1.tar.gz
1. 解压文件
tar -zxvf mxml-3.3.1.tar.gz
cd mxml-3.3.1/
2. 编译配置
./configure --prefix=/home/zdw/aliyun_oss2/osssdk/mxml --host=mips CC=/opt/mips-gcc720-uclibc0.9.33.2-r5.1.4/bin/mips-linux-uclibc-gcc CXX=/opt/mips-gcc720-uclibc0.9.33.2-r5.1.4/bin/mips-linux-uclibc-g++
3. 编译及安装
make
make install
七、oss_c_sdk编译
来到了阿里云oss sdk的移植,前面库都已经全部编译完成,相关库文件全部在/home/zdw/aliyun_oss2/osssdk/路径下,后面的编译都需要到。
1. sdk下载地址:
git clone https://github.com/aliyun/aliyun-oss-c-sdk.git
2. 解压
tar -zxvf aliyun-oss-c-sdk-3.5.0.tar.gz
cd aliyun-oss-c-sdk-3.5.0/
3. 交叉编译之前,先修改CMakeList.txt文件
set(CMAKE_VERSION 3.0.0)
SET(CMAKE_SYSTEM_NAME Linux)
SET(TOOLCHAIN_DIR "/opt/mips-gcc720-uclibc0.9.33.2-r5.1.4")
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/mips-linux-uclibc-gcc)
SET(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/bin/mips-linux-uclibc-g++)
FIND_PROGRAM(APR_CONFIG_BIN NAMES apr-config apr-1-config PATHS /home/zdw/aliyun_oss2/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/zdw/aliyun_oss2/osssdk/apr-util/bin/ /usr/bin /usr/local/bin /usr/local/apr/bin/)
FIND_PROGRAM(CURL_CONFIG_BIN NAMES curl-config apu-1-config PATHS /home/zdw/aliyun_oss2/osssdk/curl/bin/ /usr/bin /usr/local/bin /usr/local/apr/bin/)
4. cmake生成Makefile文件
cmake . -DCMAKE_INSTALL_PREFIX=/home/zdw/aliyun_oss2/osssdk/oss_c_sdk -DCURL_INCLUDE_DIR=/home/zdw/aliyun_oss2/osssdk/curl/include/ -DCURL_LIBRARY=/home/zdw/aliyun_oss2/osssdk/curl/lib/libcurl.a -DAPR_INCLUDE_DIR=/home/zdw/aliyun_oss2/osssdk/apr/include/apr-1/ -DAPR_LIBRARY=/home/zdw/aliyun_oss2/osssdk/apr/lib/libapr-1.a -DAPR_UTIL_INCLUDE_DIR=/home/zdw/aliyun_oss2/osssdk/apr-util/include/apr-1 -DAPR_UTIL_LIBRARY=/home/zdw/aliyun_oss2/osssdk/apr-util/lib/libaprutil-1.a -DMINIXML_INCLUDE_DIR=/home/zdw/aliyun_oss2/osssdk/mxml/include/ -DMINIXML_LIBRARY=/home/zdw/aliyun_oss2/osssdk/mxml/lib/libmxml.a
cmake之后出现如下错误
CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
.......
RT_LIBRARY
linked by target "oss_c_sdk_sample" in directory /home/zdw/aliyun_oss02/aliyun-oss-c-sdk-3.5.0/oss_c_sdk_sample
linked by target "oss_c_sdk_test" in directory /home/zdw/aliyun_oss02/aliyun-oss-c-sdk-3.5.0/oss_c_sdk_test
需要继续修改CMakeList.txt文件,将oss_c_sdk_sample和oss_c_sdk_test去掉,再重新cmake下,就生成Makefile文件
# add_subdirectory(oss_c_sdk_sample)
# add_subdirectory(oss_c_sdk_test)
5. 编译及安装
make -j
make install
编译发现报错误
aliyun-oss-c-sdk-3.5.0/oss_c_sdk/aos_status.c:95:33: error: dereferencing pointer to incomplete type 'mxml_node_t {aka struct _mxml_node_s}'
node_content = code_node->child->value.opaque;
需要将aliyun-oss-c-sdk-3.5.0\third_party\include\mxml下的config.h和mxml.h文件拷贝到 /home/zdw/aliyun_oss2/osssdk/mxml/include目录下,重新编译。
八、实战-编译demo
1. 新建一个文件oss-demo 将前面编译的头文件及库文件放到oss-demo目录下,目录结构参考最上面的附件
2.在官网下载aliyun-oss-c-sdk-demo.tar.gz,这边编译oss-c-sdk-demo-specified-installation这个demo进行测试
3. 修改makefile文件,参考如下
# OSS C SDK DEMO FOR Specified Installation PATH
INSTALLATION_PATH = /home/zdw/oss-demo
INCLUDES = -I. -I $(INSTALLATION_PATH)/include -I $(INSTALLATION_PATH)/include/oss_c_sdk -I $(INSTALLATION_PATH)/include/curl -I $(INSTALLATION_PATH)/include/apr-1 -I $(INSTALLATION_PATH)/include/mxml -I $(INSTALLATION_PATH)/include/apr-util
SRCS = main.c
OBJS = $(SRCS:.c=.o)
CC = /opt/mips-gcc720-uclibc0.9.33.2-r5.1.4/bin/mips-linux-uclibc-gcc
CFLAGS = -Wall -O -g
LIBS = -lpthread -L$(INSTALLATION_PATH)/lib -loss_c_sdk_static -lcrypto -lssl -lcurl -lapr-1 -lmxml -laprutil-1
EXE = oss_test
$(EXE):$(OBJS)
$(CC) $^ -o $@ $(LIBS)
%.o: %.c
$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
clean:
rm -f $(EXE) $(OBJS)
编译报错一:
/home/zdw/aliyun_oss02/apr-1.7.4/strings/apr_snprintf.c:102: undefined reference to `modf'
/home/zdw/aliyun_oss02/apr-1.7.4/strings/apr_snprintf.c:109: undefined reference to `modf'
/home/zdw/aliyun_oss02/apr-1.7.4/strings/apr_snprintf.c:133: undefined reference to `modf'
解决:修改apr-1.7.4/strings/apr_snprintf.c 增加 modf函数实现,增加下面代码
#define NDIG 80
double modf(double x, double *intpart){
double frac = x - (long long int)x;
*intpart = x - frac;
return frac;
}
重新编译apr库并替换oss-demo下的库文件
编译报错二:
/home/zdw/aliyun_oss02/apr-util-1.6.3/xlate/xlate.c:75: undefined reference to `apr_os_locale_encoding'
/home/zdw/aliyun_oss02/apr-util-1.6.3/xlate/xlate.c:72: undefined reference to `apr_os_default_encoding'
/home/zdw/aliyun_oss02/apr-util-1.6.3/xlate/xlate.c:75: undefined reference to `apr_os_locale_encoding'
/home/zdw/aliyun_oss02/apr-util-1.6.3/xlate/xlate.c:72: undefined reference to `apr_os_default_encoding'
解决:直接关掉本地编码相关的两个判断,直接返回return page
static const char *handle_special_names(const char *page, apr_pool_t *pool)
{
if (page == APR_DEFAULT_CHARSET) {
return page;//apr_os_default_encoding(pool);
}
else if (page == APR_LOCALE_CHARSET) {
return page;//apr_os_locale_encoding(pool);
}
else {
return page;
}
}
重新编译apr-util库并替换oss-demo下的库文件
再重新编译oss-c-sdk-demo-specified-installation,编译成功,将oss_test 和 动态库拷贝到板端运行。