Linux下使用Aliyun OSS C SDK

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000次 1年
简介: 详细说明了Linux下如何编译运行基于OSS C SDK的C/C++程序,附件中提供了基于Makefile的示例工程。

OSS C SDK依赖curl、apr、aprutil、mxml四个第三方库。基于OSS C SDK的应用,依赖于C SDK和四个第三方库,共五个库。四个第三方库和SDK的安装,请参考 OSS C SDK安装

本文中的示例程序,在附件oss-c-sdk-demo.tar.gz中。示例是个简单的OSS C SDK应用,您可以参考、引用或直接使用。

C/C++程序,从源代码到执行,需要经过编译、链接、运行三个步骤。OSS C SDK应用亦是如此,下面分别对这三个步骤详细说明。

编译

编译,将源代码编译成目标文件(*.obj),主要过程是预编译、语法检查、生成目标文件。预编译会对源代码中引用的头文件进行查找。语法检查即符号检查,对于函数,检查引用和原型是否匹配。编译时,有头文件即可编译通过,不需要查找库,所以也不需要指定库的位置。

GCC/G++搜索头文件的顺序如下:

  • 编译源文件时指定的搜索路径,GCC/G++通过-I指定;
  • 环境变量C_INCLUDE_PATH/CPLUS_INCLUDE_PATH指定的搜索路径;

    默认为空。
  • GCC/G++默认的头文件搜索路径;

    包括`/usr/include`,`/usr/local/include` 和 `GCC/G++的头文件目录`。GCC/G\++的头文件目录,不同Linux系统下稍有不同。

    GCC的头文件目录,通过如下命令查看

    `gcc -print-prog-name=cc1` -v
    ;G\+\+的头文件目录,通过如下命令查看
    `g++ -print-prog-name=cc1` -v 

OSS C SDK应用依赖的库,不指定安装目录,使用默认安装目录时,有以下两种安装方式:

  • 使用apt-get、yum、rpm命令安装;
  • 使用源代码安装且不指定安装路径。

使用默认安装目录时,对于不同的Linux,依赖库的头文件位置稍有不同。头文件路径是否在GCC/G++搜索路径中,如下表:

Linux curl apr/aprutil mxml sdk
Aliyun/Centos 不在,默认安装路径 /usr/include/apr-1 不在,默认安装路径 /usr/local/include/oss_c_sdk
Debian 不在,默认安装路径 /usr/include/apr-1.0 不在,默认安装路径 /usr/local/include/oss_c_sdk
Redhat 不在,默认安装路径 /usr/local/apr/include/apr-1 不在,默认安装路径 /usr/local/include/oss_c_sdk
SuSE 不在,默认安装路径 /usr/include/apr-1 不在,默认安装路径 /usr/local/include/oss_c_sdk
Ubuntu 不在,默认安装路径 /usr/local/include/oss_c_sdk


编译示例程序main.c,Ubuntu系统执行以下命令:

gcc -Wall -O -g -I. -I /usr/local/include/oss_c_sdk -c main.c -o main.o

Aliyun/Centos系统执行以下命令:

gcc -Wall -O -g -I /usr/local/include/oss_c_sdk -I /usr/include/apr-1 -c main.c -o main.o

其它Linux上类似,编译后生成目标文件main.o

注意:

  • 编译、链接、运行小节中,第三方库和OSS C SDK库都采用不指定路径的方式安装,即使用默认安装目录;指定依赖库的安装路径,其编译、链接、运行的使用方法在 指定安装路径 小节中介绍。

链接

链接,把目标程序和依赖库链接成一个整体,生成可执行文件。对于静态库,链接时把整个库写入可执行文件;运行时不需要再指定,但是可执行程序会变大。动态库链接时,可执行程序中只记录库的信息(位置、大小、版本等)和调用的函数信息(名称、偏移等)。动态库是程序共享的,可执行程序也不会膨胀。

对于使用OSS C SDK的应用,推荐使用动态库。本文中和官网提供的示例,都使用动态库。GCC/G++对动态库的搜索路径如下:

  • 链接目标文件时指定的搜索路径,GCC/G++通过-L指定;
  • 环境变量LD_LIBRARY_PATH指定的搜索路径;
    默认是空的。
  • 配置文件/etc/ld.so.conf中指定的搜索路径;
    /etc/ld.so.conf内容是ld.so.conf.d/*.conf,即包括/etc/ld.so.conf.d/*.conf配置的路径。
    可以使用命令ldconfig -v查看所有可以使用的动态库;使用如下命令查看动态库的搜索路径:

    ldconfig -v | grep -v ^$'\t'
  • 系统默认的动态库搜索路径/lib、/usr/lib或/lib64、/usr/lib64;
  • GCC/G++的默认的搜索路径。
    可以通过命令gcc -print-search-dirs查看。

上面五部分组成了依赖库的搜索路径。如果依赖库不在上述路径中,链接时需要使用-L指定。
对于不同的Linux系统,OSS C SDK应用依赖的库位置稍有不同,它们的路径是否在GCC/G++搜索路径中,如下表:

Linux curl apr/aprutil mxml sdk
Aliyun/Centos 不在,默认安装路径/usr/local/apr/lib 不在,默认安装路径/usr/local/lib
Debian 不在,默认安装路径/usr/local/apr/lib 不在,默认安装路径/usr/local/lib
Redhat 不在,默认安装路径/usr/local/apr/lib 不在,默认安装路径/usr/local/lib
SuSE
Ubuntu


链接示例main.o与依赖库 ,Ubuntu/SuSE执行以下命令:

gcc main.o -o main -lpthread -loss_c_sdk -lcurl -lmxml -lapr-1 -laprutil-1

Aliyun/Centos/Debian/Redhat执行以下命令:

gcc main.o -o main -lpthread -L/usr/local/lib -loss_c_sdk -lcurl -lmxml -L/usr/local/apr/lib -lapr-1 -laprutil-1

其它Linux上类似,链接后生成了可执行文件main

运行

运行,将可执行程序加载到内存并执行。执行时需要引用动态库。
运行时动态库搜索顺序如下:

  • 环境变量LD_LIBRARY_PATH指定的搜索路径;
    默认为空。
  • 配置文件/etc/ld.so.conf中指定的搜索路径;
    /etc/ld.so.conf内容是ld.so.conf.d/*.conf,即包括/etc/ld.so.conf.d/*.conf配置的路径。
    可以使用命令ldconfig -v查看所有可以使用的动态库;使用如下命令查看动态库的搜索路径:

    ldconfig -v | grep -v ^$'\t'
  • 系统默认的动态库搜索路径/lib、/usr/lib或/lib64、/usr/lib64。

如果链接时用-L指定了动态库的路径,且不在上述三类路径中,运行时需要使用LD_LIBRARY_PATH指定。如果运行
示例main时,报如下错误:

 ./main: error while loading shared libraries: liboss_c_sdk.so.3.0.0: cannot open shared object file: No such file or directory

说明运行时找不到动态库liboss_c_sdk。请使用LD_LIBRARY_PATH指定,执行如下命令:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

提示:

  • 示例代码中的OSS_ENDPOINT、ACCESS_KEY_ID、ACCESS_KEY_SECRET、BUCKET_NAME请更换成有效值。

指定安装路径

编译OSS C SDK应用的设备上,如果没有ROOT权限,安装第三方库和OSS C SDK时,需要指定安装目录。除非必要,不推荐安装依赖库时指定安装路径。

比如安装第三方库和OSS C SDK时,指定安装目录都是/home/your/oss/csdk,编译示例程序使用如下命令:

gcc -Wall -O -g -I. -I /home/your/oss/csdk/include -I /home/your/oss/csdk/include/oss_c_sdk -I /home/your/oss/csdk/include/curl -I /home/your/oss/csdk/include/apr-1 -c main.c -o main.o

链接示例程序使用如下命令:

gcc main.o -o main -lpthread -L/home/your/oss/csdk/lib -loss_c_sdk -lcurl -lmxml -lapr-1 -laprutil-1

执行示例程序使用如下命令:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/your/oss/csdk/lib
./main

示例工程

附件提供的示例程序,通过Makefile编译链接。Makefile是工程自动编译工具,想更多的了解Makefile的相关知识,请参看 跟我一起写Makefile

示例工程oss-c-sdk-demo-specified-installation基于OSS C SDK及依赖的第三方库,都安装在/home/your/oss/csdk下;其它示例工程是基于OSS C SDK及依赖的第三方库,安装在默认目录下,即安装时不指定目录。解压示例工程,进入目录oss-c-sdk-demo-xxx后,执行make编译链接示例工程,生成执行文件main;执行make clean清理编译链接生成的文件。

三个命令

Linux使用依赖库,下面三个命令可能会用到,详细功能和参数请使用man cmd查看。

  • ldconfig

    动态库管理命令
  • ldd

    显示可执行模块的依赖库
  • nm

    显示可执行模块中符号的信息
    
相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
目录
相关文章
|
1月前
|
存储 JavaScript 前端开发
oss使用SDK上传文件
oss使用SDK上传文件
111 2
|
8月前
|
开发工具 对象存储 Python
使用Python的SDK从OSS中下载指定日期的所有文件
使用Python的SDK从OSS中下载指定日期的所有文件
210 1
|
8天前
|
存储 移动开发 前端开发
对象存储oss使用问题之OSS SDK .net 使用下载例程报错如何解决
《对象存储OSS操作报错合集》精选了用户在使用阿里云对象存储服务(OSS)过程中出现的各种常见及疑难报错情况,包括但不限于权限问题、上传下载异常、Bucket配置错误、网络连接问题、跨域资源共享(CORS)设定错误、数据一致性问题以及API调用失败等场景。为用户降低故障排查时间,确保OSS服务的稳定运行与高效利用。
23 0
|
1月前
|
Rust API 开发工具
Rust初学者,边学边写的OSS的sdk,欢迎批评指正 :)
`Rust`语言编写的阿里云OSS的SDK,依据官方文档并参考了其他语言的实现。
216 5
Rust初学者,边学边写的OSS的sdk,欢迎批评指正 :)
|
2月前
|
对象存储
阿里云oss-cloud-sdk-springboot3兼容问题
阿里云oss-cloud-sdk-springboot3兼容问题
73 0
|
4月前
|
存储 DataWorks 开发工具
在DataWorks中,可以使用Python SDK操作阿里云OSS存储服
在DataWorks中,可以使用Python SDK操作阿里云OSS存储服
134 1
|
3天前
|
JavaScript Java Maven
云效产品使用常见问题之android sdk 构建出aar后,上传到私有maven仓库失败如何解决
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
3月前
|
安全 开发工具 Android开发
几个Flutter常见诊断错误与解决Android toolchain - develop for Android devices X Unable to locate Android SDK
几个Flutter常见诊断错误与解决Android toolchain - develop for Android devices X Unable to locate Android SDK
267 0
|
6月前
|
API 开发工具 Android开发
解决 Android App 上架 Google play后 ,签名变更,第三方sdk无法登录
解决 Android App 上架 Google play后 ,签名变更,第三方sdk无法登录
147 0
|
3月前
|
开发工具 Android开发
Android获取SDK的版本信息
Android获取SDK的版本信息
39 0

相关产品

  • 对象存储