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

时间:2013-02-20 13:09:35

标签: c++ linux shared-libraries

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

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

6 个答案:

答案 0 :(得分:1)

来自manual page

  

如果 dlopen()因任何原因失败,则返回NULL。


dlsym函数无法处理C ++标识符,除非它们已被声明为extern "C",或者您使用了错位名称。

答案 1 :(得分:1)

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

dlopen()的手册页说:

  

返回值

     

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

正如每个人提到的,如果dlopen()失败,你会得到一个null,但如果你试图解决为什么你得到神秘的null,即使你指定的路径中存在库,可能肯定所有库都存在于系统上“特定库”依赖,否则调用将失败并返回NULL;)

对.cpp文件中的函数使用extern“C”,以便编译器不会破坏它,并且可以在加载库后调用它。

答案 5 :(得分:0)

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

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

LoadMessage message;