我在 C++ 程序中使用 dlopen() 函数加载共享库。
那么如何检查它是否成功加载?或者我们可以使用该库中存在的任何函数的名称来检查库的加载吗?
我在 C++ 程序中使用 dlopen() 函数加载共享库。
那么如何检查它是否成功加载?或者我们可以使用该库中存在的任何函数的名称来检查库的加载吗?
如果未成功加载,则 dlopen() 返回 NULL。
dlopen() 的手册页说:
返回值
如果找不到文件、无法打开读取、不是 dlopen() 处理的适当对象格式,或者如果在加载文件或重新定位其符号引用的过程中发生错误,则 dlopen() 应返回 NULL。应通过 dlerror() 获得更详细的诊断信息。
正如每个人提到的,如果 dlopen() 失败,你会得到一个空值,但是如果你试图解决为什么即使你指定的路径上存在库,你也会得到神秘的空值,可以确保所有库都存在于那个“特别library" 依赖,否则调用将失败并返回 NULL ;)
使用 extern "C" 作为 .cpp 文件中的函数,这样编译器就不会破坏它,并且一旦加载库就可以调用它。
根据文档(http://linux.die.net/man/3/dlopen),dlopen在任何失败时都返回 NULL。所以你可以检查一下并完成。但是,如果由于某种原因您不相信该库是一个“好”的库,您可以为您的系统定义自己的约定。例如,您可以要求系统可加载的任何库都定义一个具有特定名称的符号,该符号具有某些特定属性,直到并包括诸如“API 密钥”之类的东西,您可以将其分配给想要编写兼容库的用户。
如果 dlopen 遇到错误,则返回 NULL,dlerror 将返回相应的错误消息。
您还可以在共享库的其中一个文件中添加静态块。当它加载成功时,它会打印一条消息。例子 :
struct LoadMessage {
init(void){
std::cout << "I am loaded\n";
}
};
LoadMessage message;