首页 > 编程知识 正文

linux运行动态库找不到,静态链接库和动态链接库

时间:2023-05-04 13:36:27 阅读:169952 作者:4310

功能:包含打开动态链接库的头文件: #include dlfcn.h

函数定义: void*dlopen(constchar*pathname,intmode ); 函数描述: dlopen ) )以指定模式打开由函数指定的动态连接库文件,并将句柄返回给调用进程。 使用dlclose ()卸载打开的库。

模式:分为这两种RTLD_LAZY保留决策,根据需要求解符号; RTLD_NOW立即决定,在返回之前解除所有未决定符号。 RTLD_LOCAL的作用与RTLD_GLOBAL相反。 在动态库中定义的元件不能在随后打开的其他库中重新定位。 如果未指定RTLD_GLOBAL或RTLD_LOCAL,则缺省值为RTLD_LOCAL。 在RTLD_GLOBAL动态库中定义的符号可以在随后打开的另一个库中重新定位。 RTLD_GROUPRTLD_WORLD

返回值:打开错误返回NULL,成功,并返回库引用。

在编译时添加- LDL (指定dl库)例如gcc test.c -o test -ldl

#ifndef WIN32

void*p_Handle=dlopen(dllfile,RTLD_NOW );

void* Error=dlerror (;

是错误

{

printf(opendll%sfailed,%sn ',DllFile,Error );

返回- 1;

}

f=(f ) dlsym(p_handle,' ff ' );

Error=dlerror (;

是错误

{

printf(dlsymfailed,%sn ),Error );

返回- 1;

}

#else

char DllName[1024];

strcpy(dllname,DllFile );

char*ptemp=strrchr(dllfile,'.';

if (主题!=NULL )

{

*pTemp=0;

sprintf(dllname,' %s.dll ',DllFile );

*pTemp='.';

}

hmodulepdllhandle=: loadlibrary (dllname;

if(pdllhandle!=NULL )

{

f=(f ) getprocaddress(pdllhandle,' ff ' );

if (! pf_CreateGame )

{

freelibrary(pdllhandle;

返回- 1;

}

}

else

{

返回- 1;

}

#endif

dlopen ()是一个强大的库函数。 函数打开新库并将其加载到内存中。 此函数主要用于加载库中的元件,在编译时不知道。 例如,Apache Web服务器在运行时使用此函数加载模块。 这提供了额外的能力。 配置文件控制模块的加载过程。 这样,即使在系统中添加或删除模块,也可以在自己的程序中使用dlopen (),而无需重新编译。 dlopen ) )在dlfcn.h中定义,并在dl库中实现。 需要文件名和标志两个参数。 文件名可以是我们学习过的库的soname。 指示是否立即计算库依赖关系的标志。 如果设置为RTLD_NOW,将立即计算; 如果设置了RTLD_LAZY,则在必要时计算。 您也可以指定RTLD_GLOBAL,以便以后加载的库可以检索元件。 加载库后,可以将其用作dlopen (从返回的句柄为dlsym )的第一个参数,以获取库中元件的地址。 通过该地址,可以获取指向库中特定函数的指针,并调用库中的相应函数。

dlsym ()的函数原型是void*dlsym(void*Handle,const char* symbol )。 此函数位于dlfcn.h文件中。 handle是dlopen打开动态链接库后返回的指针,symbol是请求检索的函数或全局变量的名称,函数的返回值为void*,可以指向函数的地址并调用。

dclose(void*handle ) )用于关闭指定句柄的动态链接库。 仅当此动态链接库的使用数量为0时,才会实际从系统中卸载。

//

dlopen () )

t">   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'。如果有好几个函数库,它们之间有一些依赖关系的话,例如X依赖Y,那么你就要先加载那些被依赖的函数。例如先加载Y,然后加载X。dlopen()函数的返回值是一个句柄,然后后面的函数就通过使用这个句柄来做进一步的操作。如果打开失败dlopen()就返回一个NULL。如果一个函数库被多次打开,它会返回同样的句柄。如果一个函数库里面有一个输出的函数名字为_init,那么_init就会在dlopen()这个函数返回前被执行。我们可以利用这个函数在我的函数库里面做一些初始化的工作。我们后面会继续讨论这个问题的。

dlerror() :通过调用dlerror()函数,我们可以获得最后一次调用dlopen(),dlsym(),或者dlclose()的错误信息。




版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。