【发布时间】:2014-09-22 07:08:42
【问题描述】:
现在,我已经尝试加载动态库一个小时,卡在无法加载符号,让我告诉你我的问题。 这是我的代码的sn-p,
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)
我没有遇到这个问题,对此的任何帮助将不胜感激。
【问题讨论】:
-
由于
LoadOneFunc实际加载,有什么特别的理由选择不发布它吗? -
您可以尝试在链接选项中添加
--export-dynamic或-rdynamic吗? -
我已经更新了问题描述,添加了 LoadOneFunct 定义。