oss c sdk在嵌入式环境下如何编译-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

oss c sdk在嵌入式环境下如何编译

yjseu 2015-10-23 15:03:39 14916
目前OSS官网上提供的oss c sdk说明文档以及代码的README中简单介绍了编译所需的第三方软件,对于如何安装没有详细介绍,这里简单分享一下嵌入式环境下编译oss c sdk的过程,如有不周全的地方,大家可以各抒己见。
首先,对于为什么没有在oss c sdk中直接提供第三方库,我揣测是因为*nix系统的版本比较多,考虑兼容性问题,没有简单的办法直接给出经过编译后的oss c sdk静态库,另外,对于嵌入式环境,sdk静态库的大小也是很重要的一个因素,下面给出我们在嵌入式环境中编译oss c sdk的过程。


目前,oss c sdk依赖的第三方库包括libcurl、libxml2、apr以及apr-util这个四个第三方库,这几个库的作用分别是:
libcurl:封装网络通信,方便用户使用sdk和oss进行交互
libxml2:解析oss返回的内容,目前oss返回的信息是xml形式,比如出错时的相关错误信息等,具体可以参考OSS API文档   https://docs.aliyun.com/?spm=5176.383663.9.2.OBvrxr#/pub/oss/api-reference/abstract
apr、apr-util:这两个库主要用于封装底层的一些跨平台数据结构,解决c开发时候诸如内存管理等复杂的细节,方便用户编写代码,同时,解决跨平台问题。


对于这四个第三方库,libxml2库相对来说比较大,建议后面可以使用诸如minixml等轻量级的第三方库替代,减少sdk占用的空间大小。


好了,言归正传,接下来说一下这四个第三方库如果编译的吧。
1、libcurl
(1)安装包获取
     website: http://curl.haxx.se
(2)安装方式
     首先可以参考libcurl的一个安装指南: http://curl.haxx.se/docs/install.html, 建议大家抽空看一下,内容还是比较详细的。因为libcurl中包含了很多附加的功能,在嵌入式环境中可以去掉一些用不到的特性。典型的一个编译方式如下:
    ./configure CFLAGS='-Os' --prefix=/usr/local/libcurl  --disable-ftp --disable-file --disable-ldap --disable-dict -disable-telnet --disable-tftp --disable-rtsp --disable-pop3 -disable-imap --disable-smtp --disable-gopher --disable-ares -disable-debug --without-ssl --without-zlib --without-libidn
    make
    make install


2、libxml2
(1)安装包获取
     website: http://xmlsoft.org
(2)安装方式
     首先可以参考libxml2的一个安装指南: http://www.cokco.cn/thread-11777-1-1.html  ,同样建议大家抽空看一下,值得注意的是,文档中给出libxml2针对嵌入式环境的优化选项--with-minimum,经过测试之后,这个选项的确可以很大程度上减少libxml2第三方库的大小,应该是去除了很多不是常用的特性。典型的一个编译方式如下:
    ./configure CFLAGS='-Os' --with-minimum  --with-writer --with-tree  --with-xpath
     make
     make install


3、apr
(1)安装包获取
     website: https://apr.apache.org
(2)安装方式
     apr库安装没有特别需要注意的地方,只是建议安装时候指定prefix,这个在安装apr-util库时会用到。典型的一个编译方式如下:
     ./configure CFLAGS='-Os' --prefix=/usr/local/apr/
      make
      make install


4、apr-util
(1)安装包获取
     website: https://apr.apache.org
(2)安装方式
     apr-util库安装时候需要注意指定--with-apr选项,该值需要和上面apr库指定的prefix选项值一致。典型的一个编译方式如下:
     ./configure  CFLAGS='-Os' --prefix=/usr/local/apr-util   --with-apr=/usr/local/apr
     make
     make install


至此,oss c sdk安装需要的第三方库都安装好了,我们注意到README中有一个可选的第三方库utf8proc,这个库的作用是将编码方式变为utf8,因为OSS许多地方要求utf8的编码格式,有需要的用户可以选择采用,如果系统默认的编码方式utf8,那就没必要安装这个库了,这里我们没有选择这个第三方库。


写了那么多,还有最后一点说明一下,那就是oss c sdk的编译方式,目前sdk的代码中提供了一个自动编译的脚本compile_oss_sdk.sh,打开脚本内容如下:
autoheader
aclocal
autoconf
automake --add-missing
./configure
make


相信进行C开发的同学对这个应该不会陌生,对了,这个就是使用auto make的方式自动去构建Makefile,免去手动写Makefile的麻烦。值得注意的是,因为我们第三方库可能指定了特定的路径,为了能够顺利通过编译,需要修改一下Makefile.am这个文件:
INCLUDES=\
    -I.\
    -I/usr/local/include/\
    -I/usr/include/libxml2\
    -I/usr/local/apr/include/apr-1\
    -I/usr/local/apr-util/include/apr-1


liboss_c_sdk_a_CFLAGS=\
    -D_LARGEFILE64_SOURCE\
    -fPIC


注意上面的红色部分,需要改为安装后自己系统上第三方库的路径。


最后,提一点我们测试后的发现,auto make方式编译时会进行一些重复的编译,导致生成的sdk静态库会偏大,如果对静态库本身的大小比较在意,可以自己手动创建Makefile,给出一个参考的例子:
SOURCE_FILES=\
    aos_log.c\
    aos_fstack.c\
    aos_string.c\
    aos_util.c\
    aos_status.c\
    aos_http_io.c\
    aos_buf.c\
    aos_transport.c\
    oss_xml.c\
    oss_define.c\
    oss_auth.c\
    oss_bucket.c\
    oss_multipart.c\
    oss_util.c\
    oss_object.c


INCLUDES=\
    -I.\
    -I/usr/local/include/\
    -I/usr/include/libxml2\
    -I/usr/local/apr/include/apr-1\
    -I/usr/local/apr-util/include/apr-1


CFLAGS=\
    -D_LARGEFILE64_SOURCE\
    -fPIC


OSS_C_SDK_STATIC=./liboss_c_sdk.a
OSS_C_SDK_OBJ=./*.o


all: $(OSS_C_SDK_STATIC)
$(OSS_C_SDK_OBJ): $(SOURCE_FILES)
    $(CC) -c $(CFLAGS) $(SOURCE_FILES) $(INCLUDES)


$(OSS_C_SDK_STATIC): $(OSS_C_SDK_OBJ)
    $(AR) cqs $@ $(OSS_C_SDK_OBJ)


install: all
    @echo


clean:
    rm -f *.o $(OSS_C_SDK_STATIC)


好了,说了很多,希望对大家能有一些帮助,如果在具体编译过程中遇到其他问题或者有其他好的建议也请大家提出来,我们一起改进。

XML API 开发工具 vr&ar 对象存储 数据格式
分享到
取消 提交回答
全部回答(6)
  • leetoun
    2018-08-28 17:17:07
    Reoss c sdk在嵌入式环境下如何编译
    比较及时的看到了这篇文章,感觉阿里云的各种论坛比较混乱。
    0 0
  • 慢慢的大米
    2018-08-20 16:40:19
    Reoss c sdk在嵌入式环境下如何编译
    请问有没有编译成库的教程啊 要泡在linux下
    0 0
  • 只是寻常
    2017-06-28 23:14:41
    Reoss c sdk在嵌入式环境下如何编译
    官方提供的oss-c-sdk-demo-ubuntu运行发现 错误 ,错误如下: put object from buffer failed put object from file failed, code:-990, error_code:HttpIoError, error_msg:Couldn't resolve host name, request_id: get object to buffer failed get object to local file failed delete object failed



    楼主以及各位大神能够帮我解决一下嘛、很急很急很急。。。
    0 0
  • 逝年
    2015-11-30 11:46:45
    回 4楼up366的帖子
    你好,请问你的Windows的 这个 静态库生成了嘛?  还是直接用的源码啊

    -------------------------

    回 7楼yjseu的帖子
    你好,我把Windows下的Demon代码添加到 MTK手机平台上,一直编译不过报很多错误,是我没加 .dll嘛? 小白请教对添加第三方库这边不是很了解。忘支持下  谢谢。
    0 0
  • up366
    2015-11-04 10:48:48
    回1楼yjseu的帖子
    您好,根据官网提供的window版本demo,修改oss_config.c中相应的配置后,总提示“InvalidBucketName”,我的bucket已经存在了,请问这是什么原因呢?
    0 0
滑动查看更多
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

推荐文章
相似问题
推荐课程