[英]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等)。 ..)。
“要点”是在第二个示例中使用双引号:
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.