我在C ++程序中使用dlopen()函数加载共享库。
然后如何检查它是否成功加载? 或者我们可以使用该库中存在的任何函数的错位名称来检查库的加载吗?
答案 0 :(得分:1)
答案 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;