繁体   English   中英

使用./调用共享库

[英]Calling a shared library using ./

我很好奇在Linux中使用dlopen调用共享库。 假设我想在C中使用一个名为fileName.so的共享库。 我正在64位Ubuntu Linux上工作,并且包含dlfcn.h并使用dlopen函数访问共享库。

当我使用dlopen(fileName.so, RTLD_LAZY) ,将返回NULL句柄,并且不会打开共享库。 但是,当我使用dlopen("./fileName.so", RTLD_LAZY)dlopen执行其工作并打开共享库。 似乎要点是在文件名之前使用./

如果能帮助我弄清楚为什么要在代码中使用./ ,将不胜感激。 谢谢

POSIX表示dlopen()必须知道在哪里寻找文件,并且当文件名不包含定义的/实现时,该行为将保留。 在Linux上,如果不提供路径名(名称中带有/的名称),则dlopen()仅在“标准位置”中查找,该位置由环境变量(例如LD_LIBRARY_PATH或通过/etc/ld.so.conf (或/etc/ld.so.cache ;另请参阅ldconfig(8) )或标准位置,例如/lib/usr/lib

当您指定相对名称./fileName.so ,它将知道在当前目录中查找,该目录通常不是它所在的位置。

请注意,在同时支持32位和64位可执行文件的系统上,您可能会遇到一些有趣的问题,并且对于不同类库的位置使用了各种约定。 Unix的其他变体使用模糊的相关系统- dlopen()大多数情况下都使用dlopen()等(从历史上看,并非总是如此),并使用各种环境变量(DYLD_LIBRARY_PATH,LIBPATH,SHLIB_PATH,LD_RUN_PATH,LD_LIBRARY_PATH_32,LD_LIBRARY_PATH_64等)。 ..)。

./.so文件的相对路径。 这意味着该文件位于当前目录中。

在* nix中,默认情况下,给定没有绝对或相对路径的文件名时, dlopen将在默认位置的设置列表中搜索该库。

“要点”是在第二个示例中使用双引号:

    dlopen("./fileName.so", RTLD_LAZY)

如果要包括自己的库/文件名,请用双引号将其引起来。 您甚至不需要./ ,只要文件位于./建议的当前目录中即可。

按照dlopen手册页的示例:

    handle = dlopen("libm.so", RTLD_LAZY);
       if (!handle) {
           fprintf(stderr, "%s\n", dlerror());
           exit(EXIT_FAILURE);
       }

文件名用引号引起来。

但是,如先前的回答所指定,dlopen将在“标准”位置查找“包含”。 在工作目录中包含一个库的另一种方法(尽管显然不是共享系统库)是使用预处理器指令,并将文件名括在双引号中:

#include <stdio.h>
#include <stdlib.h>
#include "myCustomLibrary.h"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM