Linux——库文件

库文件

某些功能实现的代码(预先编译好的方法)集合。
例如:C++的标准模板库STL

分类

库文件存放的位置为:/lib或者/usr/lib
库对应的头文件一般放在/usr/include

  1. 静态库
    在链接过程中,将库中的内容链接合并到最终的可执行文件中,在执行时,不需要静态库的支持。
    如果对库的内容进行修改,并不会影响之前生成的可执行文件。
    windows上的文件形式:***.lib
    Linux上的文件形式:***.a
  2. 共享库
    在链接过程中,只是给使用到的库中的方法一个标记,可执行文件中并没有包含共享库。在执行时,由操作系统动态加载到内存上。执行时,需要共享库的支持。
    只要共享库更新了,可执行文件不需要更新,就可以使用新共享库的功能。
    windows上的文件形式:***.dll
    Linux上的文件形式:***.so

静态库的生成

  1. 编译要生成库的源文件,可以有多个,编译成目标文件.o
  2. 使用ar命令生成静态库mymath(库名一般不念前缀和后缀)
    在这里插入图片描述

静态库使用

在这里插入图片描述
库名只需不用写前缀和后缀;比如:-lmymath

用ldd命令可以查看当前可执行文件所依赖的库
在这里插入图片描述

注意:在完成上述操作后,删除静态库及相关的.o文件后重新执行可执行程序,依然可以成功执行,因为静态库会把我们所使用的方法的实现包含进可执行文件中,尽管主机上已经删除了可执行文件的库,程序依然可以执行,但是,共享库不能做到这一点,因为共享库并未将所用方法包含进去,只是做一个标记,说明需要使用哪一个方法,在运行程序的时候再动态加载共享库。

共享库的生成

在这里插入图片描述

使用

在这里插入图片描述
经常出现以下的问题:
程序执行时,操作系统加载共享库但找不到它的位置
在这里插入图片描述
所以,在使用共享库时,必须指定操作系统加载库的位置:

  • /lib
  • /usr/lib
    这两个路径是系统默认搜索库的路径,但要将我们生成的库拷贝到这两个路径下,必须由root用户管理,因此该方法不常用。
    我们使用下面的方法:
    如果要将自己定义的一个库加载成为每次都可以使用的形式,可以使用如下方法:
  1. 先进入root用户
  2. mv lib*.so /usr/lib

修改环境变量:LD_LIBRARY_PATH

由环境变量指定操作系统加载库的路径,修改方式有以下的两种:

  1. 终端上修改(但仅对当前终端有效)
  2. 修改终端的配置文件(对所有启动的终端有效)

1. 终端上修改(但仅对当前终端有效)

 	export  LD_LIBRARY_PATH=绝对路径

在这里插入图片描述

2. 修改终端的配置文件~/.bashrc(对所有启动的终端有效)

  1. 进入配置文件
	vim   .bashrc
  • 再把“export LD_LIBRARY_PATH=绝对路径“添加到文件末行

  • 保存并退出
    在这里插入图片描述

共享库的优势

  • 共享库由于并不将所使用到方法包含到可执行程序中,只是使用标记,运行时动态加载,运行程序时,多个使用该库的可执行程序只需要加载一份,节省了存储空间,反之静态库会占用更多的磁盘空间和内存空间,但是共享库也要求在所在主机上必须存在该库文件才可可以执行。
  • 共享库更容易优化升级,使用时直接连接新库即可,原来的可执行程序不需要重新编译。
  • 若使用静态库优化升级,代码就必须重新编译。

静态库的优势

  • 不需要再动态加载库文件,直接使用
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值