动态加载共享库时出现未定义的符号错误
Getting undefined symbol error while dynamic loading of shared library
动态加载库时出现undefined symbol
错误。以下是我生成此错误的代码片段:
int main ()
{
void *lib_handle = NULL;
MyClass* (*create)();
void (*destroy)(MyClass*);
char *error;
lib_handle = dlopen ("./libshared.so", RTLD_LAZY);
if (lib_handle == NULL)
{
fprintf(stderr, "%sn", dlerror());
exit(1);
}
create = (MyClass* (*)()) dlsym(lib_handle, "create_object");
if ((error = dlerror()) != NULL)
{
fprintf(stderr, "%sn", error);
exit(1);
}
destroy = (void (*)(MyClass*)) dlsym(lib_handle, "destroy_object");
MyClass *myClass = (MyClass*) create;
destroy(myClass);
dlclose(lib_handle);
}
但当我简单地通过注释上面的代码并导出库路径来加载库时,一切都像魅力一样。
对于动态链接,我在命令提示符下使用以下命令。
g++ -Wl,--export-dynamic shared_user.cpp -ldl
如有任何帮助,我们将不胜感激。
您很可能会在此处看到Name Mangling的操作。
如果您想将dlopen()
/dlsym()
与C++共享库一起使用,您需要:
- 将要通过
dlsym()
查找的函数声明为extern "C" { ... }
,以便C++编译器为它们创建未映射的名称
只有当您尝试访问的函数是非成员或静态成员函数,并且没有重载(只有单个签名)时,这才有可能;在其他情况下,C++无法创建未映射的名称
如果有人通过extern "C" { ... }
请求编译器这样做,并且可以创建一个未映射的名称,那么它最终会逐字记录在ELF符号表中。然后,您可以使用dlsym()
查找它,就像查找任何C函数一样 - 找出函数的损坏名称,并在
dlsym()
调用中使用该名称
后者可以通过nm
实用程序完成。例如:
$ nm libstdc++.a | grep -v '^ ' | grep unexpected
0000000000000000 T __cxa_call_unexpected
0000000000000000 T _ZN10__cxxabiv112__unexpectedEPFvvE
0000000000000000 T _ZSt10unexpectedv
0000000000000000 T _ZSt14set_unexpectedPFvvE
0000000000000000 D _ZN10__cxxabiv120__unexpected_handlerE
这些是损坏的名称,是C++编译器实际放入ELF对象中的名称。如果您使用-C
选项请求nm
为您解组名称,则会得到:
$ nm -C libstdc++.a | grep -v '^ ' | grep unexpected
0000000000000000 T __cxa_call_unexpected
0000000000000000 T __cxxabiv1::__unexpected(void (*)())
0000000000000000 T std::unexpected()
0000000000000000 T std::set_unexpected(void (*)())
0000000000000000 D __cxxabiv1::__unexpected_handler
这意味着,对于这个lib,如果您想从中获得指向std::unexpected()
的函数指针,则必须请求dlsym(hdl, "_ZN10__cxxabiv112__unexpectedEPFvvE");
才能使查找成功。
相关文章:
- vscode g++链路故障:体系结构x86_64的未定义符号
- 体系结构x86_64的未定义符号:std:terminate(),typeinfo,运算符delete[],运算符new
- C++ 中 dlsym 的未定义符号
- 仅在 MacOS 上析构函数的未定义符号
- OSX clang++:用于 cpp 文件中显式实例化模板的体系结构x86_64的未定义符号
- PCL 出错:体系结构x86_64 @pcl的未定义符号
- clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用) - 体系结构的未定义符号 x86_64:
- 体系结构x86_64的未定义符号:链接器错误
- C++ std::vector<int> 体系结构的未定义符号 x86_64:
- 生成文件:体系结构x86_64的未定义符号
- libc++abi未定义符号:_ZTVN10__cxxabif120__si-class_type_infoE
- Xcode"体系结构x86_64的未定义符号"
- 体系结构x86_64的未定义符号:找不到原因
- SWIG链接器:未定义符号:_ZN2cv8fastFreeEPv(cv::fastFree(void*))
- 如何修复架构x86_64的未定义符号,Boost Asio 1.58
- 在Qt5上去静态库:架构的未定义符号x86_64:
- 体系结构x86_64的未定义符号:c++/ h 文件和 cpp 文件
- 监视 SDK 下的未定义符号"__Unwind_SjLj_Unregister"
- 使用 Boost/Python 的未定义符号 - 复杂
- 建筑x86_64的未定义符号:"vtkDebugLeaksManager::vtkDebugLeaksManager()",引用自: