开发者社区> 问答> 正文

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

目前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)


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

展开
收起
yjseu 2015-10-23 15:03:39 18690 0
6 条回答
写回答
取消 提交回答
  • Reoss c sdk在嵌入式环境下如何编译
    比较及时的看到了这篇文章,感觉阿里云的各种论坛比较混乱。
    2018-08-28 17:17:07
    赞同 展开评论 打赏
  • Reoss c sdk在嵌入式环境下如何编译
    请问有没有编译成库的教程啊 要泡在linux下
    2018-08-20 16:40:19
    赞同 展开评论 打赏
  • 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



    楼主以及各位大神能够帮我解决一下嘛、很急很急很急。。。
    2017-06-28 23:14:41
    赞同 展开评论 打赏
  • 回 4楼up366的帖子
    你好,请问你的Windows的 这个 静态库生成了嘛?  还是直接用的源码啊

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

    回 7楼yjseu的帖子
    你好,我把Windows下的Demon代码添加到 MTK手机平台上,一直编译不过报很多错误,是我没加 .dll嘛? 小白请教对添加第三方库这边不是很了解。忘支持下  谢谢。
    2015-11-30 11:46:45
    赞同 展开评论 打赏
  • 回1楼yjseu的帖子
    您好,根据官网提供的window版本demo,修改oss_config.c中相应的配置后,总提示“InvalidBucketName”,我的bucket已经存在了,请问这是什么原因呢?
    2015-11-04 10:48:48
    赞同 展开评论 打赏
  • 回 楼主(yjseu) 的帖子
    这两天有用户反馈,在编译下载的oss c sdk中sample代码中默认是有utf8的依赖的。这里做一下说明,这个版本中的sample case中的确有说明如何使用utf8编码,和开发同学也沟通过,后面版本的sample中会考虑去除utf8编码的例子,用户可以根据自己的实际情况选择是否需要显示使用utf8第三方库进行编码(嵌入式环境下可能默认就是utf8编码)。下面说明一下如何进行utf8第三方库的安装和编译。
    (1)安装包获取
         website: https://github.com/JuliaLang/utf8proc
    (2)安装方式
        utf8proc第三方库是一个轻量级的utf8编码第三方库,典型的一个编译方式如下:  
         make  
         sudo make install

         注意:utf8proc这个第三方库采用默认编译方式生成的lib本人机器上库路径是/usr/local/lib, 头文件路径是/usr/local/include

    对sample进行编译时注意utf8proc的头文件和lib库路径是否在Makefile.am中或者自己手动编写的Makefile文件中

    对于sample的运行,用户只需要修改oss_config.c中相应的配置,比如oss域名,用户的access_key_id和access_key_secret,以及bucket名字。对于测试的bucket,建议用户使用一个新的bucket。sample中的case采用c开发常用的测试框架CuTest进行组织,按照bucket相关的测试、object相关的测试、multipart相关的测试进行分类,对应的测试文件分别是test_oss_bucket.c、test_oss_object.c和test_oss_multipart.c,用户可以修改test_all.c中的testlist达到不同类型测试的目的。

    static const struct testlist {
        const char *testname;
        CuSuite *(*func)(void);
    } tests[] = {
        {"test_oss_bucket", test_oss_bucket},
        {"test_oss_object", test_oss_object},
        {"test_oss_multipart", test_oss_multipart},
        {"LastTest", NULL}

    };

    最后,很多用户在看sample中代码的时候可能会有一个疑问,那就是如果自己如何利用oss c sdk写一个程序,建议用户注意一下test_all.c中的main函数:
    int main(int argc, char *argv[])
    {
        int exit_code;
        //aos_http_io_initialize first
        if (aos_http_io_initialize("oss_test", 0) != AOSE_OK) {
            exit(1);
        }


        aos_log_level = AOS_LOG_OFF;
        exit_code = run_all_tests(argc, argv);

        //aos_http_io_deinitialize last
        aos_http_io_deinitialize();

        return exit_code;
    }

    这个main函数说明了CuTest运行时候的具体方法,首先注意红色部分,用户在写程序时首先需要调用aos_http_io_initialize进行初始化,函数中第一个参数允许用户对访问oss时候的user-agent进行定制,方便事后对日志进行统计。程序写完程序最后需要显示调用aos_http_io_deinitialize进行清理工作。初始化和清理工作整个过程仅且只调用一次。

    最后欢迎大家提出编译oss c sdk或者利用oss c sdk写程序中遇到的问题

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

    对于sample中的case,如果想单独运行某个类型的具体case,比如想单独测试put_object_from_buffer这个接口,那个可以修改test_oss_object.c中的CuSuite *test_oss_object()实现,比如:
    CuSuite *test_oss_object()
    {
        CuSuite* suite = CuSuiteNew();

        SUITE_ADD_TEST(suite, test_object_setup);
        SUITE_ADD_TEST(suite, test_put_object_from_buffer);
        /*
        SUITE_ADD_TEST(suite, test_put_object_from_file);
        SUITE_ADD_TEST(suite, test_get_object_to_buffer);
        SUITE_ADD_TEST(suite, test_get_object_to_file);
        SUITE_ADD_TEST(suite, test_head_object);
        SUITE_ADD_TEST(suite, test_copy_object);
        SUITE_ADD_TEST(suite, test_object_by_url);
        SUITE_ADD_TEST(suite, test_delete_object);
        SUITE_ADD_TEST(suite, test_put_object_from_file);
        SUITE_ADD_TEST(suite, test_append_object_from_buffer);
        SUITE_ADD_TEST(suite, test_append_object_from_file);
        */
        SUITE_ADD_TEST(suite, test_object_cleanup);
        return suite;
    }

    达到单独测试的目的,当然,如果已经对利用oss c sdk写程序很有感觉,完全可以抛开CuTest框架,利用上面帖子中说的方式自己写case,只是需要注意初始化和清理工作

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

    回 1楼(yjseu) 的帖子
    官网新出的oss c sdk 0.0.6版本去除了sample对于utf8第三方库的依赖,同时为了方便大家快速上手,在sample的基础上新增了demo,demo中包含了最基本的上传数据、下载数据和阿里云OSS最有特色的append功能。最近收到很多用户的反馈,希望能够快速搞定第三方库的安装,我们也会向开发同学提出需求,后续推出方便大家快速搞定第三方库的一键安装工具。

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

    回 4楼(up366) 的帖子jiao liu q
    在交流区回复你了,提供一下使用的bucket和host

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

    回 6楼(逝年) 的帖子
    请下载windows版本的c sdk,里面有工程文件,在oss_c_sdk_lib工程的release里面有编译好的静态库,当然您也可以自己重新编译

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

    回 8楼(逝年) 的帖子
    确认项目包含apr/apr-util、libxml2、libcurl这些第三方库的头文件和lib库以及dll库,如果缺少第三方库的头文件或者lib库,在编译的时候会出错,提示找不到相应的库,如果在生成的exe文件所在目录中没有dll库,运行的时候会提示缺少dll库。这些第三方库可以在oss c sdk提供的domo工程中找到,具体来说lib库在thrid_party中,dll库在debug目录下,另外确认项目属性中包含了这些库的路径
    2015-10-28 16:51:34
    赞同 展开评论 打赏
滑动查看更多
问答排行榜
最热
最新

相关电子书

更多
OSS运维进阶实战手册 立即下载
《OSS运维基础实战手册》 立即下载
OSS运维基础实战手册 立即下载