当前位置: 技术问答>linux和unix
linux动态链接库加载问题,急!
来源: 互联网 发布时间:2017-03-07
本文导语: 各位高手,最近在做一个涉及到LINUX动态链接库的活,因为以前没用过动态链接库,现在有几个问题搞不明白。 1、有个动态链接库libtest.so 以及声明文件test.h. 现在我要用里面的一个函数test_a(); 我的测试程序是test_so...
各位高手,最近在做一个涉及到LINUX动态链接库的活,因为以前没用过动态链接库,现在有几个问题搞不明白。
1、有个动态链接库libtest.so 以及声明文件test.h.
现在我要用里面的一个函数test_a(); 我的测试程序是test_so.c
#include
int mian(void){
test_a();
return 0;
}
那么我现在编译的时候只需要执行命令gcc test_so.c -L. -ltest test_so -o test_so
然后执行命令:test_so 似乎就可以了
2、若上面成立,那么中的函数
void *dlopen (const char *filename, int flag); //用于打开指定名字(filename)的动态链接库
void *dlsym(void *handle, char *symbol); //取函数执行地址
这些函数什么时候用啊?
我看有的例子就是用的上面的两个函数来调用动态链接库的,请各位高手指教,谢谢
1、有个动态链接库libtest.so 以及声明文件test.h.
现在我要用里面的一个函数test_a(); 我的测试程序是test_so.c
#include
int mian(void){
test_a();
return 0;
}
那么我现在编译的时候只需要执行命令gcc test_so.c -L. -ltest test_so -o test_so
然后执行命令:test_so 似乎就可以了
2、若上面成立,那么中的函数
void *dlopen (const char *filename, int flag); //用于打开指定名字(filename)的动态链接库
void *dlsym(void *handle, char *symbol); //取函数执行地址
这些函数什么时候用啊?
我看有的例子就是用的上面的两个函数来调用动态链接库的,请各位高手指教,谢谢
|
|
dlopen这类库函数确实也是用于加载动态库的,我是这样理解的:
1.前者在程序运行的时候便会检测相应动态库文件是否存在,而且只会在系统默认的目录下搜索指定的动态库文件,而后者在运行之前不会检测动态库文件是否存在,并且相应的库文件可以放在其它任意目录下。
2.前者对应的so动态库文件如果有变更的话,可能整个程序需要重新编译过才能正常运行,而后者不需要。
1.前者在程序运行的时候便会检测相应动态库文件是否存在,而且只会在系统默认的目录下搜索指定的动态库文件,而后者在运行之前不会检测动态库文件是否存在,并且相应的库文件可以放在其它任意目录下。
2.前者对应的so动态库文件如果有变更的话,可能整个程序需要重新编译过才能正常运行,而后者不需要。
|
一般来说第一种方法如果能满足需要,直接用第一种就可以了。
如果需要额外的动态特性,比如运行期决定加载哪个库,或者程序加载时这个库还不存在,需要延迟加载,都可以使用第二种方法。
如果需要额外的动态特性,比如运行期决定加载哪个库,或者程序加载时这个库还不存在,需要延迟加载,都可以使用第二种方法。
|
动态加载不需要#include ,编译时不需要-ltest。程序运行时加载.so。
用哪种比较好要看情况阿,除了6楼说的,我觉得还有:.so比较小时,两种方法都差不多。
.so比较大时,而你只用其中一小部分功能是,最好用第二种方法,使用前加载,使用后关闭。