- 什么动态链接库?
动态链接库又称为共享库,在linux下以lib***.so的形式存在,所谓动态,就是在程序运行是转载链接,不像静态在编译是就已经知道需要的对象库同时还将其链接复制到了程序体内!
- 如何创建共享库?
运用gcc(如果是C++程序就用bcc或g++)命令外加-shared(顾名思义,就是共享的意思)
例如:gcc -o lib***.so xxx.o yyy.o -shared 将生成lib***.so共享文件;
- 不过大多数时候还加上一个命令参数-fpic,表示于位置无关,那么什么又叫做于位置无关呢?
与位置无关就是说,一个共享库可能会在一个时刻或者一段时间被多个进程共享,而最先运行的程序将首次转载此共享库到内存中,其他进程将共享同一个库副本;由于库是第一个程序装载的,它用共享库当然没问题,因为是我请你来内存的;如果不叫于位置无关的参数命令,那么其他的程序就用不了它,只好自己去请一个同样的到内存来,大家想想,这样是不是很浪费内存阿,每个进程进来都要自己带一个进来占用空间,大家何不和气一点,用一个呢?因此就有了-fpic,实现多个进程共享同一个副本!也就是于位置无关了!
- 相关命令:
ldd (参数)
参数是可执行程序,此命令可以查看程序所要用的所有共享库文件!比如:ldd ./test
- 还有一个很重要的问题:动态链接库的加载?
如何加载一个自己的动态链接库,我们知道系统的库目录一般都在lib目录下面;简单一点的方法就是将自己生存的共享库直接丢到这些个目录下面,因为每个程序都会到系统指定的目录下面去找;但是目录里面包含的东西太多了,不便于管理;还好系统为我们提供一个环境变量(LD_LIBRARY_PATH)此变量在linux,unix, Solaris, FreeBSD等系统存在,而AIX系统中有一个LIBPATH变量,HPUX系统中有一个SHLIB_PATH变量;
有了以上的信息,我们便可以创建我们自己的共享库目录搜索路径:
首先到用户根目录下,打开.bashrc(ubuntu下的,其他为.bash_profile),然后就可添加环境变量:
export LD_LIBRARY_PATH=此处填写你的路径名,如果有多个可以用冒号(:)隔开(比如:路径1:路径2:路径3);OK,保存退出,重新打开终端后,便可成功!