我使用dlopen为我的项目制作了插件。
我希望让我的主程序在没有插件时再次尝试加载插件。
这有什么好的解决方案吗? 我需要比较dlerror消息吗?
请帮帮我
答案 0 :(得分:1)
来自manpage:
如果
dlopen()
因任何原因失败,则返回NULL
。
还有一个非常广泛的例子。
实施例
下面的程序加载(glibc)数学库,查找 cos(3)函数的地址,并打印2.0的余弦值。该 以下是构建和运行程序的示例:
$ cc dlopen_demo.c -ldl $ ./a.out -0.416147
节目来源
#include <stdio.h> #include <stdlib.h> #include <dlfcn.h> #include <gnu/lib-names.h> /* Defines LIBM_SO (which will be a string such as "libm.so.6") */ int main(void) { void *handle; double (*cosine)(double); char *error; handle = dlopen(LIBM_SO, RTLD_LAZY); if (!handle) { fprintf(stderr, "%s\n", dlerror()); exit(EXIT_FAILURE); } dlerror(); /* Clear any existing error */ cosine = (double (*)(double)) dlsym(handle, "cos"); /* According to the ISO C standard, casting between function pointers and 'void *', as done above, produces undefined results. POSIX.1-2003 and POSIX.1-2008 accepted this state of affairs and proposed the following workaround: *(void **) (&cosine) = dlsym(handle, "cos"); This (clumsy) cast conforms with the ISO C standard and will avoid any compiler warnings. The 2013 Technical Corrigendum to POSIX.1-2008 (a.k.a. POSIX.1-2013) improved matters by requiring that conforming implementations support casting 'void *' to a function pointer. Nevertheless, some compilers (e.g., gcc with the '-pedantic' option) may complain about the cast used in this program. */ error = dlerror(); if (error != NULL) { fprintf(stderr, "%s\n", error); exit(EXIT_FAILURE); } printf("%f\n", (*cosine)(2.0)); dlclose(handle); exit(EXIT_SUCCESS); }