库文件
某些功能实现的代码(预先编译好的方法)集合。
例如:C++的标准模板库STL
分类
库文件存放的位置为:/lib
或者/usr/lib
库对应的头文件一般放在/usr/include
- 静态库
在链接过程中,将库中的内容链接合并到最终的可执行文件中,在执行时,不需要静态库的支持。
如果对库的内容进行修改,并不会影响之前生成的可执行文件。
windows上的文件形式:***.lib
Linux上的文件形式:***.a
- 共享库
在链接过程中,只是给使用到的库中的方法一个标记,可执行文件中并没有包含共享库。在执行时,由操作系统动态加载到内存上。执行时,需要共享库的支持。
只要共享库更新了,可执行文件不需要更新,就可以使用新共享库的功能。
windows上的文件形式:***.dll
Linux上的文件形式:***.so
静态库的生成
- 编译要生成库的源文件,可以有多个,编译成目标文件
.o
- 使用
ar命令
生成静态库mymath(库名一般不念前缀和后缀)
静态库使用
库名只需不用写前缀和后缀;比如:-lmymath
用ldd命令可以查看当前可执行文件所依赖的库
注意:在完成上述操作后,删除静态库及相关的.o文件后,重新执行可执行程序,依然可以成功执行,因为静态库会把我们所使用的方法的实现包含进可执行文件中,尽管主机上已经删除了可执行文件的库,程序依然可以执行,但是,共享库不能做到这一点,因为共享库并未将所用方法包含进去,只是做一个标记,说明需要使用哪一个方法,在运行程序的时候再动态加载共享库。
共享库的生成
使用
经常出现以下的问题:
程序执行时,操作系统加载共享库但找不到它的位置
所以,在使用共享库时,必须指定操作系统加载库的位置:
- /lib
- /usr/lib
这两个路径是系统默认搜索库的路径,但要将我们生成的库拷贝到这两个路径下,必须由root用户管理,因此该方法不常用。
我们使用下面的方法:
如果要将自己定义的一个库加载成为每次都可以使用的形式,可以使用如下方法:
- 先进入root用户
- mv lib*.so /usr/lib
修改环境变量:LD_LIBRARY_PATH
由环境变量指定操作系统加载库的路径,修改方式有以下的两种:
- 终端上修改(但仅对当前终端有效)
- 修改终端的配置文件(对所有启动的终端有效)
1. 终端上修改(但仅对当前终端有效)
export LD_LIBRARY_PATH=绝对路径
2. 修改终端的配置文件~/.bashrc(对所有启动的终端有效)
- 进入配置文件
vim .bashrc
-
再把“export LD_LIBRARY_PATH=绝对路径“添加到文件末行
-
保存并退出
共享库的优势
- 共享库由于并不将所使用到方法包含到可执行程序中,只是使用标记,运行时动态加载,运行程序时,多个使用该库的可执行程序只需要加载一份,节省了存储空间,反之静态库会占用更多的磁盘空间和内存空间,但是共享库也要求在所在主机上必须存在该库文件才可可以执行。
- 共享库更容易优化升级,使用时直接连接新库即可,原来的可执行程序不需要重新编译。
- 若使用静态库优化升级,代码就必须重新编译。
静态库的优势
- 不需要再动态加载库文件,直接使用