1.什么是库
在windows平台和linux平台下都大量存在着库。
本质上来讲库是一种可执行代码的二进制形式,能够被操做系统载入内存执行。
因为windows和linux的本质不一样,所以两者库的二进制是不兼容的。
本文仅限于介绍linux下的库linux
2.库的种类
linux下的库有两种:静态库和共享库(动态库)。windows
两者的不一样点在于代码被载入的时刻不一样。
静态库的代码在编译过程当中已经被载入可执行程序,所以体积较大。
共享库的代码是在可执行程序运行时才载入内存的,在编译过程当中仅简单的引用,所以代码体积较小。函数
3.库存在的意义
库是别人写好的现有的,成熟的,能够复用的代码,你可使用但要记得遵照许可协议。
现实中每个程序都要依赖不少基础的底层库,不可能每一个人的代码都从零开始,所以库的存在乎义非同寻常。共享库的好处是,不一样的应用程序若是调用相同的库,那么在内存里只须要有一份该共享库的实例。spa
4.库文件是如何产生的在linux下
静态库的后缀是.a,它的产生分两步
Step 1.由源文件编译生成一堆.o,每一个.o里都包含这个编译单元的符号表
Step 2.ar命令将不少.o转换成.a,成文静态库
动态库的后缀是.so,它由gcc加特定参数编译产生。
例如:
$ gcc -fPIC -c *.c $ gcc -shared -Wl,-soname, libfoo.so.1 -o libfoo.so.1.0 *.操作系统
5.库文件是如何命名的,有没有什么规范
在linux下,库文件通常放在/usr/lib和/lib下,
静态库的名字通常为libxxxx.a,其中xxxx是该lib的名称
动态库的名字通常为libxxxx.so.major.minor,xxxx是该lib的名称,major是主版本号, minor是副版本号命令行
6.如何知道一个可执行程序依赖哪些库
ldd命令能够查看一个可执行程序依赖的共享库,
例如# ldd /bin/lnlibc.so.6
=> /lib/libc.so.6 (0×40021000)/lib/ld-linux.so.2
=> /lib/ld- linux.so.2 (0×40000000)
能够看到ln命令依赖于libc库和ld-linux库orm
7.可执行程序在执行的时候如何定位共享库文件
当系统加载可执行代码时候,可以知道其所依赖的库的名字,可是还须要知道绝对路径
此时就须要系统动态载入器(dynamic linker/loader)
对于elf格式的可执行程序,是由ld-linux.so*来完成的索引
它前后搜索elf文件的 DT_RPATH段—环境变量LD_LIBRARY_PATH—/etc/ld.so.cache文件列表—/lib/,/usr/lib目录内存
找到库文件后将其载入内存ci
8.在新安装一个库以后如何让系统可以找到他
若是安装在/lib或者/usr/lib下,那么ld默认可以找到,无需其余操做。
若是安装在其余目录,须要将其添加到/etc/ld.so.cache文件中,步骤以下
1.编辑/etc/ld.so.conf文件,加入库文件所在目录的路径
2.运行ldconfig,该命令会重建/etc/ld.so.cache文件
############################################################
linux中编译静态库(.a)和动态库(.so)的基本方法
静态库 在linux环境中, 使用ar命令建立静态库文件.以下是命令的选项: ar 命令的命令行格式以下: 好比建立一个静态库文件的命令以下: 使用ranlib程序建立库的索引,索引存放在库文件内部. 用nm程序显示存档文件的索引,它能够显示目标文件的符号
动态库
通常应用程序的库文件不与系统库文件放在同一个目录下,通常把应用程序的共享库文件放在/usr/local/lib下,新建一个属于本身的目录apue,而后把刚才libapue.so复制过去就好了 /* 参数的配置经过man gcc能够看到 -llibrary 链接名为 library 的 库文件. 链接器 在 标准搜索目录 中 寻找 这个 库文件, 库文件 的 真正 名 字 |