如何使用dlopen检查共享库是否已成功加载
How to check shared library is loaded successfully or not loaded using dlopen?
Im使用C++程序中的dlopen()函数加载共享库。
那么如何检查它是否成功加载?或者我们可以使用该库中存在的任何函数的损坏名称来检查该库的加载吗?
从手册页面:
如果dlopen()由于任何原因失败,它将返回NULL。
dlsym
函数不能处理C++标识符,除非它们已经声明为extern "C"
,或者您使用了损坏的名称。
如果没有成功加载,dlopen()将返回NULL。
dlopen()的手册页上写着:
返回值
如果找不到文件,无法打开进行读取,或者文件不是合适的对象dlopen()处理的格式,或者如果在加载过程中发生错误文件或重新定位其符号引用时,dlopen()应返回NULL。更详细的诊断信息应通过dlerror()获得。
根据文档(http://linux.die.net/man/3/dlopen),dlopen在任何失败时都返回NULL。所以你只要检查一下就可以了。但是,如果出于某种原因,你不相信这个库是一个"好"的库,你可以为你的系统定义自己的约定。例如,您可以要求系统可加载的任何库定义一个具有特定名称的符号,该符号具有一些特定属性,最多包括"API密钥",您可以将其分配给想要编写兼容库的用户。
如果dlopen遇到错误,它将返回NULL,dlerror将返回相应的错误消息。
正如每一个提到的那样,如果dlopen()失败,你会得到一个null,但如果你试图解决为什么你会得到神秘的null,即使库存在于你指定的路径上,也可以确保所有库都存在于"特定库"所依赖的系统上,否则调用将以null失败;)
为.cpp文件中的函数使用extern"C",这样编译器就不会损坏它,并且您可以在加载库后调用它。
您还可以在共享库的一个文件中添加一个静态块。成功加载后,它将打印一条消息。示例:
struct LoadMessage {
init(void){
std::cout << "I am loadedn";
}
};
LoadMessage message;
- 有没有办法知道Tracer是否成功地完全连接到了jaegerclientcpp中的jaeger后端服务器
- 如何检查cURL是否成功登录?c ++
- 如何检查文件复制和写入是否成功
- 设计自己的结果/两者之一:是否应该始终指定成功类型和错误类型
- 如何检查文件是否复制成功?(便携式解决方案)C++
- 如何检查C++智能指针内存分配是否成功?
- 如何使用C++检查 mysql 查询是否成功
- 要检查 SetFilePointerEx、ReadFile 或 WriteFile 是否成功,我是否需要检查 lpNew
- 检查 void* 是否成功使用 static_cast 反对
- 检查是否已成功创建新阵列
- 有没有办法在编译时检测是否可以使用一组给定的参数类型成功调用通用 lambda?
- "template"关键字限定符是否会导致代码成功编译,但不同?
- 如何检查使用 Aws::Transfer::Transfermanager 下载是否成功
- 检查发布方法是否成功使用了蚊子
- C++ODBC检查连接是否成功
- C++ sqlite3 如何知道 SQL 语句是否成功执行
- 如何在 c++11 std::regex_replace 中检查是否成功
- 是否可以在没有完全定义着色器的情况下测试缓冲区数据是否成功加载到GPU上?(C++、OpenGL 4.4、GLFW)
- 检查显式强制转换是否成功
- 计算' cin.getline() '是否成功