1

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

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

4

6 回答 6

1

手册页

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


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

于 2013-02-20T13:12:33.007 回答
1

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

dlopen() 的手册页说:

返回值

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

于 2013-02-20T13:13:33.150 回答
0

正如每个人提到的,如果 dlopen() 失败,你会得到一个空值,但是如果你试图解决为什么即使你指定的路径上存在库,你也会得到神秘的空值,可以确保所有库都存在于那个“特别library" 依赖,否则调用将失败并返回 NULL ;)

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

于 2013-02-20T13:22:28.780 回答
0

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

于 2013-02-20T13:14:05.753 回答
0

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

于 2013-02-20T13:14:56.010 回答
0

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

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

LoadMessage message;
于 2020-07-14T10:39:34.903 回答