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指定的搜索路径;

    默认为空。
    AI 代码解读
  • GCC/G++默认的头文件搜索路径;

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

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

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

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
AI 代码解读

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

gcc -Wall -O -g -I /usr/local/include/oss_c_sdk -I /usr/include/apr-1 -c main.c -o main.o
AI 代码解读

其它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'
    AI 代码解读
  • 系统默认的动态库搜索路径/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
AI 代码解读

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
AI 代码解读

其它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'
    AI 代码解读
  • 系统默认的动态库搜索路径/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
AI 代码解读

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

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
AI 代码解读

提示:

  • 示例代码中的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
AI 代码解读

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

gcc main.o -o main -lpthread -L/home/your/oss/csdk/lib -loss_c_sdk -lcurl -lmxml -lapr-1 -laprutil-1
AI 代码解读

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

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/your/oss/csdk/lib
./main
AI 代码解读

示例工程

附件提供的示例程序,通过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

    动态库管理命令
    AI 代码解读
  • ldd

    显示可执行模块的依赖库
    AI 代码解读
  • nm

    显示可执行模块中符号的信息
    
    AI 代码解读
相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
目录
打赏
0
0
0
1
3059
分享
相关文章
AI助理化繁为简,速取代码参数——使用python SDK 处理OSS存储的图片
只需要通过向AI助理提问的方式输入您的需求,即可瞬间获得核心流程代码及参数,缩短学习路径、提升开发效率。
1521 4
AI助理化繁为简,速取代码参数——使用python SDK 处理OSS存储的图片
DataWorks产品使用合集之如何使用Python和阿里云SDK读取OSS中的文件
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
对象存储OSS产品常见问题之go语言SDK client 和 bucket 并发安全如何解决
对象存储OSS是基于互联网的数据存储服务模式,让用户可以安全、可靠地存储大量非结构化数据,如图片、音频、视频、文档等任意类型文件,并通过简单的基于HTTP/HTTPS协议的RESTful API接口进行访问和管理。本帖梳理了用户在实际使用中可能遇到的各种常见问题,涵盖了基础操作、性能优化、安全设置、费用管理、数据备份与恢复、跨区域同步、API接口调用等多个方面。
228 9
对象存储OSS产品常见问题之python sdk中的append_object方法支持追加上传xls文件如何解决
对象存储OSS是基于互联网的数据存储服务模式,让用户可以安全、可靠地存储大量非结构化数据,如图片、音频、视频、文档等任意类型文件,并通过简单的基于HTTP/HTTPS协议的RESTful API接口进行访问和管理。本帖梳理了用户在实际使用中可能遇到的各种常见问题,涵盖了基础操作、性能优化、安全设置、费用管理、数据备份与恢复、跨区域同步、API接口调用等多个方面。
269 9
linux下面的j2sdk的安装和配置过程
linux下面的j2sdk的安装和配置过程!   1.
1046 0
|
7天前
|
linux命令详细说明以及案例
本文介绍了常用的 Linux 命令及其详细说明和示例,包括:`ls`(列出目录内容)、`cd`(更改目录)、`rm` 和 `mv`(删除与移动文件)、`grep`(搜索文本)、`cat`(显示文件内容)以及 `chmod`(更改文件权限)。每个命令均配有功能描述、选项说明及实际案例,帮助用户更好地掌握 Linux 命令的使用方法。
90 56
|
10天前
|
Linux基础:文件和目录类命令分析。
总的来说,这些基础命令,像是Linux中藏匿的小矮人,每一次我们使用他们,他们就把我们的指令准确的传递给Linux,让我们的指令变为现实。所以,现在就开始你的Linux之旅,挥动你的命令之剑,探索这个充满神秘而又奇妙的世界吧!
55 19
|
25天前
|
Linux 常用文件查看命令
`cat` 命令用于连接文件并打印到标准输出,适用于快速查看和合并文本文件内容。常用示例包括:`cat file1.txt` 查看单个文件,`cat file1.txt file2.txt` 合并多个文件,`cat > filename` 创建新文件,`cat >> filename` 追加内容。`more` 和 `less` 命令用于分页查看文件,`tail` 命令则用于查看文件末尾内容,支持实时追踪日志更新,如 `tail -f file.log`。
47 5
Linux 常用文件查看命令
|
7天前
|
linux常用命令详细说明以及案例
本文介绍了Linux中几个常用的命令及其用法,包括:`ls`(列出目录内容)、`cd`(切换目录)、`mkdir`(创建目录)、`rm -p`(删除目录及内容)和`mv`(移动或重命名文件/目录)。每个命令都配有详细说明、语法格式、常见选项及实用案例,帮助用户更好地理解和使用这些基础命令。内容源自[linux常用命令详细说明以及案例](https://linux.ciilii.com/show/news-285.html)。
|
2月前
|
Linux系统之whereis命令的基本使用
Linux系统之whereis命令的基本使用
108 24
Linux系统之whereis命令的基本使用

云存储

+关注

相关产品

  • 对象存储