ln -s libhello.so.1.0 libhello.so.1
ln -s libhello.so.1 libhello.so
一、使用库当要使用静态的程序库时,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,所以一旦连接成功,静态程序库也就不再需要了。然 而,对动态库而言,就不是这样。动态库会在执行程序内留下一个标记‘指明当程序执行时,首先必须载入这个库。由于动态库节省空间,linux下进行连接的 缺省操作是首先连接动态库,也就是说,如果同时存在静态和动态库,不特别指定的话,将与动态库相连接。
为了让执行程序顺利找到动态库,有三种方法:
(1):把库拷贝到/usr/lib和/lib目录下。
(2):通过设定环境变量LD_LIBRARY_PATH也可以指定动态库路径。当通过该环境变量指定多个动态库搜索路径时,路径之间用冒号":"分隔。例如动态库libhello.so在/home/ting/lib目录下,使用命令:
export LD_LIBRARY_PATH=LD_LIBRARY_PATH:/home/ting/lib
在设置该环境变量后所有的命令中,该环境变量都有效。可以用echo命令查看 LD_LIBRAY_PATH 的设置内容:
echo $LD_LIBRARY_PATH
(3) :修改/etc/ld.so.conf文件,把库所在的路径加到文件末尾。该文件中每一行是一个动态库搜索路径。每次编辑完该文件后,都必须运行命令ldconfig使修改后的配置生效。这样,加入的目录下的所有库文件都可见。
动态库的搜索路径搜索的先后顺序是:
(1):编译目标代码时指定的动态库搜索路径;
(2):环境量LD_LIBRARY_PATH指定的动态库搜索路径;
(3):配置文件/etc/ld.so.conf中指定的动态库搜索路径;
(4):默认的动态库搜索路径/lib;
(5):.默认的动态库搜索路径/usr/lib。
在上述(1)、(2)、(3)指定动态库搜索路径时,都可指定多个动态库搜索路径,其搜索的先后顺序是按指定路径的先后顺序搜索的。
二、生成库
生成静态库
连接成静态库使用ar命令,其实ar是archive的意思
ar cqs libhello.a hello.o
连接成动态库
生成动态库用gcc来完成,由于可能存在多个版本,因此通常指定版本号:
gcc -shared -Wl,-soname,libhello.so.1 -o libhello.so.1.0 hello.o
另外再建立两个符号连接:
ln -s libhello.so.1.0 libhello.so.1
ln -s libhello.so.1 libhello.so
这样一个libhello的动态连接库就生成了。最重要的是传gcc -shared 参数使其生成是动态库而不是普通执行程序。-Wl 表示后面的参数也就是-soname,libhello.so.1直接传给连接器ld进行处理。实际上,每一个库都有一个soname,当连接器发现它正在查找的程序库中有这样一个名称,连接器便会将soname嵌入连结中的二进制文件内,而不是它正在运行的实际文件名,在程序执行期间,程序会查找拥有soname名字的文件,而不是库的文件名,换句话说,soname是库的区分标志。这样做的目的主要是允许系统中多个版本的库文件共存,习惯上在命名库文件的时候通常与soname相同
libxxxx.so.major.minor
其中,xxxx是库的名字,major是主版本号,minor 是次版本号