【发布时间】:2013-02-05 12:02:03
【问题描述】:
我在 C++ 程序中使用 dlopen() 函数加载共享库。
那么如何判断是否加载成功呢? 或者我们可以使用该库中存在的任何函数的重命名来检查库的加载吗?
【问题讨论】:
-
dlopen 函数出错时返回 NULL,这是您要找的吗?有关更详细的说明,请参见 dlopen 的手册页。
标签: c++ linux shared-libraries
我在 C++ 程序中使用 dlopen() 函数加载共享库。
那么如何判断是否加载成功呢? 或者我们可以使用该库中存在的任何函数的重命名来检查库的加载吗?
【问题讨论】:
标签: c++ linux shared-libraries
【讨论】:
如果没有成功加载,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;
【讨论】: