繁体   English   中英

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

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

我在 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 ;)

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

您还可以在共享库的文件之一中添加静态块。 当它加载成功时,它会打印一条消息。 例子 :

struct LoadMessage {
        init(void){
        std::cout << "I am loaded\n";
        }
};

LoadMessage message;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM