如何使用dlopen检查共享库是否已成功加载

How to check shared library is loaded successfully or not loaded using dlopen?

本文关键字:是否 成功 加载 共享 何使用 dlopen 检查      更新时间:2023-10-16

Im使用C++程序中的dlopen()函数加载共享库。

那么如何检查它是否成功加载?或者我们可以使用该库中存在的任何函数的损坏名称来检查该库的加载吗?

从手册页面:

如果dlopen()由于任何原因失败,它将返回NULL。


dlsym函数不能处理C++标识符,除非它们已经声明为extern "C",或者您使用了损坏的名称。

如果没有成功加载,dlopen()将返回NULL。

dlopen()的手册页上写着:

返回值

如果找不到文件,无法打开进行读取,或者文件不是合适的对象dlopen()处理的格式,或者如果在加载过程中发生错误文件或重新定位其符号引用时,dlopen()应返回NULL。更详细的诊断信息应通过dlerror()获得。

根据文档(http://linux.die.net/man/3/dlopen),dlopen在任何失败时都返回NULL。所以你只要检查一下就可以了。但是,如果出于某种原因,你不相信这个库是一个"好"的库,你可以为你的系统定义自己的约定。例如,您可以要求系统可加载的任何库定义一个具有特定名称的符号,该符号具有一些特定属性,最多包括"API密钥",您可以将其分配给想要编写兼容库的用户。

如果dlopen遇到错误,它将返回NULL,dlerror将返回相应的错误消息。

正如每一个提到的那样,如果dlopen()失败,你会得到一个null,但如果你试图解决为什么你会得到神秘的null,即使库存在于你指定的路径上,也可以确保所有库都存在于"特定库"所依赖的系统上,否则调用将以null失败;)

为.cpp文件中的函数使用extern"C",这样编译器就不会损坏它,并且您可以在加载库后调用它。

您还可以在共享库的一个文件中添加一个静态块。成功加载后,它将打印一条消息。示例:

struct LoadMessage {
        init(void){
        std::cout << "I am loadedn";
        }
};
LoadMessage message;