linux 中的共享库的特点和制作示例

linux中的共享库或者动态库静态库一样都是一些函数的集合,可以使代码复用。共享库的优点是占用空间小、程序编译时候需要共享库了,仅仅是做个引用,不会真正的把静态库编译进去。这是和静态库的最大区别。由于仅仅是做了一个引用。所以程序运行的时候,才会把库加载到内存中。速度上比静态库差了一些,优点是管理和更新很方便。一次更新,所有的引用这个库的程序都会得到更新。

linux中共享库的命名

libname.so.x.y.z -- lib 固定的写法, name 表示库的名字, so 共享库的后缀, z,y,z 分别是主版本号,次版本号和发行版本号。 版本号可以不含。

这里介绍了linux中的静态库,生成一个程序pro,一个程序可以有静态库,或者动态库或者不用库。 查看程序中的动态库的命令 ldd

ldd pro
        linux-vdso.so.1 =>  (0x00007ffdbfb16000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f70e7a42000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f70e7e10000)

静态库的基础上创建一个动态库

gcc -shared -o libmy.so add.o sub.o # 生成了 libmy.so 文件

重新连接 pro

gcc -o pro pro.c -L . -lmy

ldd pro
        linux-vdso.so.1 =>  (0x00007fff7afee000)
        libmy.so => not found
        libc.so.6 => /lib64/libc.so.6 (0x00007ff956856000)
        /lib64/ld-linux-x86-64.so.2 (0x00007ff956c24000)

这里可以看到重新连接了程序pro, 动态库libmy.so 也加入了,但是找不到。这个找不到和程序命令找不到是类似的,程序命令找不到可以通过环境变量PATH来解决,程序运行的动态库找不到可以用LD_LIBRARY_PATH来解决。

# 把当前的路径,加入到动态库的搜索路径中
# export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH (保留原来的库搜索路径)
export LD_LIBRARY_PATH=.


ldd pro
        linux-vdso.so.1 =>  (0x00007ffccfbf5000)
        libmy.so => ./libmy.so (0x00007f62c11d0000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f62c0e02000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f62c13d2000)

关于动态库的两个环境变量 LD_LIBRARY_PATH LIBRARY_PATH 。前者是运行时候的变量,后者是编译连接的时候的变量。 如果执行了

export LIBRARY_PATH=.
gcc -o pro pro.c  -lmy # 可以这些写,不用指定了 -L. 

ldconfig 是做什么用的?

linux程序运行的时候,动态库的查找可以从LD_LIBRARY_PATH中查找,也可以在 /etc/ld.so.conf 指定的路径中查找。如果修改了 /etc/ld.so.conf 需要执行 ldconfig

留下评论