现在,我一直在尝试加载动态库一小时,无法加载符号,让我告诉你我的问题。 这是我的代码片段,
void *hInstLib = dlopen("libnbuVmwareTools.so",RTLD_NOW);
LoadOneFunc(hInstLib,(void **)&vmcGetDiskChangedInfoStrm_Ptr,"vmcGetDiskChangedInfoStrm");
void LoadOneFunc(void* dlHandle, void** pFunction, const char* funcName)
{
std::stringstream strStream;
*pFunction = dlsym(dlHandle, funcName);
char* dlErrStr = dlerror();
if (*pFunction == NULL || dlErrStr != NULL)
{
strStream << "Failed to load " << funcName << ". Error = " << dlErrStr << "\n";
throw std::runtime_error(strStream.str().c_str());
}
}
现在,我已经检查过libnbuVmwareTools.so中存在vmcGetDiskChangedInfoStrm,
lib已成功加载,但是,
[root@vm vmcbt]# g++ dltest.cpp -L/root/vmware/usr/openv/lib -lnbuVmwareTools
[root@vm vmcbt]# ./a.out
Successfully loaded Library
Error while dynamically loading : Failed to load vmcGetDiskChangedInfoStrm. Error = /root/vmware/usr/openv/lib/libnbuVmwareTools.so: undefined symbol: vmcGetDiskChangedInfoStrm
当使用nm -C命令检查.so文件中是否存在符号时,
[root@vm vmcbt]# cd
[root@vm ~]# cd /root/vmware/usr/openv/lib/
[root@vm lib]# nm -C libnbuVmwareTools.so | grep vmcGetDiskChangedInfoStrm.
00000000006680bc T vmcGetDiskChangedInfoStrm(void*, int, long, char const*, char const*, char const*, char const*, std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >&, bool)
我没有得到这个问题,对此的任何帮助将不胜感激。
答案 0 :(得分:4)
该函数被定义为C ++函数(我可以看到它,因为它在列表中有参数类型)。所以你需要弄清楚名称是什么,可能是_Z25vmcGetDiskChangedInfoStrmPvilPKcS1_S1_S1_RSt18basic_stringstreamIcSt11char_traitsIcESaIcEEb
,然后寻找它。