2017-06-01 52 views
0

我使用dlopen为我的项目制作了插件。如何知道没有.so当dlopen()

我想让我的主程序停止尝试再次加载插件,当没有这样的。

有没有什么好的解决方案呢? 我需要比较错误消息吗?

请帮我

回答

0

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); 
} 
相关问题