使用dlsym()调用结构体定义函数问题求助(基于Hunspell 1.4.1)
问题排查与解决思路
嘿,我来帮你捋捋这个问题!先从你的环境背景和核心问题开始梳理:
环境信息
- 使用Hunspell 1.4.1 32位库(选择apt-get可直接获取的版本,方便快速部署,暂未使用更新版本)
- 操作系统:Debian Stretch
- 编译器:g++
核心问题点
你提到问题出在Example* setcreate这一行,虽然其他dlsym用法你确认没问题,但这一行相关的动态链接逻辑大概率是症结所在。
你的Main.cpp代码片段
#include <iostream> #include <dlfcn.h> #include <hunspell/hunspell.hxx> #include <sstream> #include <string> #include <algorithm> typedef struct Example...
具体排查与解决方向
我给你列几个最可能的原因和对应的解决办法:
结构体类型不匹配
仔细检查Example结构体的定义,确保它和你动态加载的库中导出的结构体完全一致——包括成员变量的类型、顺序,甚至内存对齐规则(比如编译器的-fpack-struct这类选项会影响布局)。如果两边定义不一样,指针转换后访问成员必然出问题。C++名称修饰坑
如果你加载的是C++库,那setcreate这类函数名会被编译器做名称修饰,直接用原名称调用dlsym肯定找不到符号。解决办法要么在库的导出代码里用extern "C"包裹函数声明,要么用nm -D your_library.so查看实际导出的修饰后符号名,再用这个完整名称调用dlsym。指针类型转换错误
dlsym返回的是void*,如果setcreate是个函数指针(而不是直接返回Example*的变量),你不能直接把它转成Example*。正确的做法是先定义对应的函数指针类型,再做转换:// 假设setcreate是无参返回Example*的函数 typedef Example* (*SetCreateFunc)(); SetCreateFunc setcreate = reinterpret_cast<SetCreateFunc>(dlsym(handle, "setcreate"));别忘了错误检查
很多时候问题出在库加载或者符号查找失败,但你没捕获错误。一定要在dlopen和dlsym之后调用dlerror()检查,比如:void* lib_handle = dlopen("your_target_lib.so", RTLD_NOW); if (!lib_handle) { std::cerr << "库加载失败: " << dlerror() << std::endl; return 1; } // 查找符号 auto setcreate = reinterpret_cast<Example*(*)()>(dlsym(lib_handle, "setcreate")); const char* err_msg = dlerror(); if (err_msg) { std::cerr << "查找setcreate符号失败: " << err_msg << std::endl; dlclose(lib_handle); return 1; }
先从这些方向排查,应该能定位到问题~
内容的提问来源于stack exchange,提问作者UltHelp
相关产品推荐
相关产品推荐

