linux系统中函数库,Linux函数库(静态函数库和动态函数库)及安装过程

Linux 系统中存在大量的函数库。简单来讲,函数库就是一些函数的集合,每个函数都具有独立的功能且能被外界调用。我们在编写代码时,有些功能根本不需要自己实现,直接调用函数库中的函数即可。

需要注意的是,函数库中的函数并不是以源代码的形式存在的,而是经过编译后生成的二进制文件,这些文件无法独立运行,只有链接到我们编写的程序中才可以运行。

Linux 系统中的函数库分为 2 种,分别是静态函数库(简称静态库)和动态函数库(也称为共享函数库,简称动态库或共享库),两者的主要区别在于,程序调用函数时,将函数整合到程序中的时机不同:

静态函数库在程序编译时就会整合到程序中,换句话说,程序运行前函数库就已经被加载。这样做的好处是程序运行时不再需要调用外部函数库,可直接执行;缺点也很明显,所有内容都整合到程序中,编译文件会比较大,且一旦静态函数库改变,程序就需要重新编译。

动态函数库在程序运行时才被加载(如图 1 所示),程序中只保存对函数库的指向(程序编译仅对其做简单的引用)。

b0b70e42c555194890c05b29c522a783.png

图 1 函数库调用

使用动态函数库的好处是,程序生成的可执行程序体积比较小,且升级函数库时无需对整个程序重新编译;缺点是,如果程序执行时函数库出现问题,则程序将不能正确运行。

Linux 系统中,静态函数库文件扩展名是 ".a",文件通常命令为 libxxx.a(xxx 为文件名);动态函数库扩展名为 ".so",文件通常命令为 libxxx.so.major.minor(xxx 为文件名,major 为主版本号,minor 为副版本号)。

目前,Linux 系统中大多数都是动态函数库(主要考虑到软件的升级方便),其中被系统程序调用的函数库主要存放在 "/usr/lib" 和 "/lib" 中;Linux 内核所调用的函数库主要存放在 "/lib/modules" 中。

注意,函数库(尤其是动态函数库)的存放位置非常重要,轻易不要做更改。

Linux 函数库的安装

Linux 发行版众多,不同 Linux 版本安装函数库的方式不同。CentOS 中,安装函数库可直接使用 yum 命令。

例如,安装 curses 函数库命令如下:

[root@Linux ~]# yum install ncurses-devel

正常情况下,函数库安装完成后就可以直接被系统识别,但凡事都有万一。这里先想一个问题,如何查看可执行程序调用了哪些函数库呢?通过以下命令即可:

[root@localhost ~]# ldd -v 可执行文件名

-v 选项的含义是显示详细版本信息(不是必须使用)。

例如,查看 ls 命令调用了哪些函数库,命令如下:

[root@localhost ~]# ldd /bin/ls

linux-gate.so.1 => (0x00d56000)

libselinux.so.1 =>/lib/libselinux.so.1 (0x00cc8000)

librt.so.1 =>/lib/librt.so.1 (0x00cb8000)

libcap.so.2 => /lib/libcap.so.2 (0x00160000)

libacl.so.1 => /lib/libacl.so.1 (0x00140000)

libc.so.6 => /lib/libc.so.6 (0x00ab8000)

libdl.so.2 => /lib/libdl.so.2 (0x00ab0000)

/lib/ld-linux.so.2 (0x00a88000)

libpthread.so.0 => /lib/libpthread.so.0 (0x00c50000)

libattr.so.1 =>/lib/libattr.so.1 (0x00158000)

如果函数库安装后仍无法使用(运行程序时会提示找不到某个函数库),这时就需要对函数库的配置文件进行手动调整,也很简单,只需进行如下操作:

将函数库文件放入指定位置(通常放在 "/usr/lib" 或 "/lib" 中),然后把函数库所在目录写入 "/etc/ld.so.conf" 文件。例如:

[root@localhost ~]# cp *.so /usr/lib/

#把函数库复制到/usr/lib/目录中

[root@localhost ~]# vi /etc/ld.so.conf

#修改函数库配置文件

include ld.so.conf.d/*.conf

/usr/lib

#写入函数库所在目录(其实/usr/lib/目录默认已经被识别)

注意,这里写入的是函数库所在的目录,而不单单是函数库的文件名。另外,如果自己在其他目录中创建了函数库文件,这里也可以直接在 "/etc/ld.so.conf" 文件中写入函数库文件所在的完整目录。

使用 ldconfig 命令重新读取 /etc/ld.so.conf 文件,把新函数库读入缓存。命令如下:

[root@localhost ~]# ldconfig

#从/etc/ld.so.conf文件中把函数库读入缓存

[root@localhost ~]# ldconfig -p

#列出系统缓存中所有识别的函数库

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值