.so Linux下动态库和静态库(.a) 的区别( 三 )

AIX LIB_PATH
LINUX LD_LIBRARY_PATH
HP_UNIX PAHT
SCO UNIX LD_LIBRARY_PATH
 
动态链接库取代静态库的好处之一就是可以随时升级库的内容 。
当动态库被接口完全相同的库文件取代后,可执行程序能迅速的切换到新动态库中代码,省去了编译的麻烦 。
 
显式调用动态库
显式调用动态库,编译时无需库文件,执行时动态可存储于任意位置,库里共享对象必须先申请后使用,不同动态库版本,只要其共享对象接口相同,就可以直接动态加载 。注意添加 "-ldl" 编译参数 。
//打开动态库  #include<dlfcn.h>  void *dlopen(const char * pathname,int mode);    //获取动态库对象地址  include<dlfcn.h>  void *dlsym(void *handle,const char *name);    //错误检测  include<dlfcn.h>  char *dlerror(vid);    //关闭动态库  include<dlfcn.h>  int dlclose(void * handle);  动态库的加载或多或少会占用一定的系统资源,比如内存等 。因此当不需要或者一段时间内不需要共享动态库时就要卸载之 。函数dlclose关闭参数handle所指向的动态库,卸载其所占的内存等资源,此调用后参数handle无效 。
实际上,由于动态库可能同时被多个进程共享,当一个进程指向dlclose时,资源并不马上被卸载,只有当全部进程都宣布关闭动态库后,操作系统才开始回收动态库资源 。
 
总结:
编译静态库时先使用-c选项,再利用ar工具产生.编译动态库的方式依不同版本的UNXI而定 。隐式调用动态库与静态库的用法相一致,而显示调用动态库则需要借助动态加载共享库函数族 。
隐式调用动态库和静态库使用方法一致,使用静态库和使用动态库编译成目标程序使用的gcc命令完全一样,那当静态库和动态库同名时,gcc命令会使用哪个库文件呢?
通过测试可以发现,当静态库和动态库同名时,gcc命令将优先使用动态库.为了确保使用的是静态库, 编译时可以加上 -static 选项,因此多第三方程序为了确保在没有相应动态库时运行正常,喜欢在编译最后应用程序时加入-static




推荐阅读