我正在尝试使用dlopen将符号加载到我的记忆中。
但是,我不确定这是否正常。
我的代码如下:
const char* lib_names[] = {"libudev.so.0.13.0"};
int lib = dlopen(lib_names[0], RTLD_NOLOAD | RTLD_LAZY | RTLD_GLOBAL);
这个lib是否可以为我判断这个共享对象是否正确打开?
感谢您的反馈
答案 0 :(得分:4)
dlopen()
返回void *
指针。指针是一个传递给其他动态链接加载器函数的句柄。因此,请将您的退货类型更改为void *
。
void *lib = dlopen(...)
您可以查看lib
以查看库是否正常打开。如果lib
为NULL,则库无法打开。如果lib
不为NULL,则库已成功打开。使用dlerror()
获取文本错误字符串,列出库无法打开的原因。例如:
void *lib = dlopen(...)
if (lib == NULL) {
fprintf(stderr, "Shared library failed to open: %s\n", dlerror());
exit(1);
}
请注意,设置RTLD_NOLOAD
标志后,dlopen()
实际上无法打开库。从手册页:
不要加载库。这可用于测试库是否已经驻留(如果不是,则dlopen()返回NULL,如果库是驻留的,则返回库的句柄)。此标志还可用于提升已加载的库上的标志。例如,可以使用RTLD_NOLOAD |重新打开先前使用RTLD_LOCAL加载的库RTLD_GLOBAL。 POSIX.1-2001中未指定此标志。
您可能需要删除RTLD_NOLOAD
才能获得所需的行为。