日期:2014-05-16  浏览次数:20717 次

linux动态链接库加载问题,急!
各位高手,最近在做一个涉及到LINUX动态链接库的活,因为以前没用过动态链接库,现在有几个问题搞不明白。
1、有个动态链接库libtest.so 以及声明文件test.h.
现在我要用里面的一个函数test_a(); 我的测试程序是test_so.c
#include <test.h>
int mian(void){
  test_a();
  return 0;
}
那么我现在编译的时候只需要执行命令gcc test_so.c -L. -ltest test_so -o test_so
然后执行命令:test_so 似乎就可以了

2、若上面成立,那么<dlfcn.h>中的函数
void *dlopen (const char *filename, int flag); //用于打开指定名字(filename)的动态链接库
void *dlsym(void *handle, char *symbol); //取函数执行地址
这些函数什么时候用啊?

我看有的例子就是用的上面的两个函数来调用动态链接库的,请各位高手指教,谢谢

------解决方案--------------------
dlopen这类库函数确实也是用于加载动态库的,我是这样理解的:
1.前者在程序运行的时候便会检测相应动态库文件是否存在,而且只会在系统默认的目录下搜索指定的动态库文件,而后者在运行之前不会检测动态库文件是否存在,并且相应的库文件可以放在其它任意目录下。
2.前者对应的so动态库文件如果有变更的话,可能整个程序需要重新编译过才能正常运行,而后者不需要。
------解决方案--------------------

更正:
1. 动态链接
2. 静态加载
参考:http://www.ibm.com/developerworks/cn/linux/l-dynamic-libraries/index.html
------解决方案--------------------
一般来说第一种方法如果能满足需要,直接用第一种就可以了。
如果需要额外的动态特性,比如运行期决定加载哪个库,或者程序加载时这个库还不存在,需要延迟加载,都可以使用第二种方法。
------解决方案--------------------
探讨
7楼您好,动态加载不需要头文件和.so库文件什么意思。
dlopen()函数第一个参数传入的不就是.so文件名称吗?
谢谢