Linux下使用Aliyun OSS C SDK

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

    显示可执行模块中符号的信息
    
上一篇:gulp压缩js


下一篇:Course Schedule II 解答