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
显示可执行模块中符号的信息