当前位置: 技术问答>linux和unix
动态链接库的疑问
来源: 互联网 发布时间:2015-11-24
本文导语: 我看了几篇文章,说.so的文件是动态链接库,可加载方式有两种一种是用一个.h的头文件直接加载另一种是用dlfcn.h,dlopen, dlsym, dlclose调用,这两者有什么区别呀,如果第一种方法那它和.a的静态链接库是不是就没什么区别...
我看了几篇文章,说.so的文件是动态链接库,可加载方式有两种一种是用一个.h的头文件直接加载另一种是用dlfcn.h,dlopen, dlsym, dlclose调用,这两者有什么区别呀,如果第一种方法那它和.a的静态链接库是不是就没什么区别了吧。好象是.a的静态链接库是在编译时就编译进了程序中,而动态链接库是在运行时才动态调用的吧。我有些不明白,如果是动态调用的话怎么还有两种调用方式呢。能不能请哪位大侠给解释一下。
|
动态库占用内存少,静态库占用内存多。
同一个静态库如果被调用10次,需要占用10个空间。
而用动态库只需要一次就可以!
同一个静态库如果被调用10次,需要占用10个空间。
而用动态库只需要一次就可以!
|
一种是用一个.h的头文件直接加载
你编译的时候,把动态库的位置指定,-L/你的路径 -l你的库(libmath.so就写成-lmath)
另一种是用dlfcn.h,dlopen, dlsym, dlclose调用
在程序里面指定的去打开,类似打开文件,加载
你编译的时候,把动态库的位置指定,-L/你的路径 -l你的库(libmath.so就写成-lmath)
另一种是用dlfcn.h,dlopen, dlsym, dlclose调用
在程序里面指定的去打开,类似打开文件,加载
|
用dlfcn.h,dlopen, dlsym, dlclose调用,是在运行过程中去加载动态库,就算是指定的动态库不存在,一样不会导致进程退出
.so是指共享对象,在刚开始运行程序时,就会去加载相应的.so,如果不存在程序就会退出,其它方面就如同楼上两位所说一样
.so是指共享对象,在刚开始运行程序时,就会去加载相应的.so,如果不存在程序就会退出,其它方面就如同楼上两位所说一样
|
dlopen等函数是库的动态加载的统一接口,使用这些函数时,甚至被调用的库不存在都没关系。比较方便。使用.h文件加载,要在源码中加入这个.h文件,还要在运行时把.so文件加载进来,有点费事。 但这种加载和.a文件的使用是有本质区别的:如果多个文件调用该.a文件,那就要在编译时加载多次,每次都要消耗资源;如果多个文件调用.so文件,大家共享即可,只需要消耗一次资源,这也就时.so文件被成为共享库的道理。