45fan.com - 路饭网

搜索: 您的位置主页 > 网络频道 > 阅读资讯:如何使用LinuxC++动态加载共享库?

如何使用LinuxC++动态加载共享库?

2016-08-26 15:30:54 来源:www.45fan.com 【

如何使用LinuxC++动态加载共享库?

编译时需要 链接库 dl

dlopen()

dlopen函数打开一个函数库然后为后面的使用做准备。C语言原形是:

void * dlopen(const char *filename, int flag);

如果文件名filename是以“/”开头,也就是使用绝对路径,那么dlopne就直接使用它,而不去查找某些环境变量或者系统设置的函数库所在的目录了。否则dlopen()

就会按照下面的次序查找函数库文件:

1. 环境变量LD_LIBRARY指明的路径。
2. /etc/ld.so.cache中的函数库列表。
3. /lib目录,然后/usr/lib。不过一些很老的a.out的loader则是采用相反的次序,也就是先查/usr/lib,然后是/lib。

Dlopen()函数中,参数flag的值必须是RTLD_LAZY或者RTLD_NOW,
RTLD_LAZY的意思是resolve undefined symbols as code from the dynamic library is executed,
而RTLD_NOW的含义是resolve all undefined symbols before dlopen() returns and fail if this cannot be done'。
注意: 如果加载的动态库还依赖其他的动态库,必须使用
RTLD_NOW

如果有好几个函数库,它们之间有一些依赖关系的话,例如X依赖Y,那么你就要先加载那些被依赖的函数。例如先加载Y,然后加载X。

dlopen()函数的返回值是一个句柄,然后后面的函数就通过使用这个句柄来做进一步的操作。如果打开失败dlopen()就返回一个NULL。如果一个函数库被多次打开,它会返回同样的句柄。

如果一个函数库里面有一个输出的函数名字为_init,那么_init就会在dlopen()这个函数返回前被执行。我们可以利用这个函数在我的函数库里面做一些初始化的工作。我们后面会继续讨论这个问题的。




本文地址:http://www.45fan.com/a/question/68018.html
Tags: linux 动态 C++
编辑:路饭网
关于我们 | 联系我们 | 友情链接 | 网站地图 | Sitemap | App | 返回顶部