【发布时间】:2014-06-05 18:25:54
【问题描述】:
我正在使用以下 sn-p 在 Linux 上加载 so 库:
handle = dlopen("myLib.so", RTLD_LAZY);
if(handle == NULL) {
throw std::runtime_error("unable to load myLib.so");
}
然后我尝试访问so 中的一个方法:
getter = dlsym(handle, "getMethod");
if(getter == 0) {
std::ostringstream msg;
msg << "missing entry point " << dlerror();
throw std::runtime_error(msg.str().c_str());
}
运行此程序时,dlopen 阶段没有异常,但我不断收到错误:
missing entry point undefined symbol: getMethod
在myLib.so 上运行nm 会显示getMethod:
> nm myLib.so | grep get
0000000000024220 T getMethod
我想要并且我也在该方法上使用extern "C"。
更新
我现在怀疑虽然句柄的 NULL 检查不会导致异常,但句柄本身可能存在问题。
除了 == NULL 之外,我是否可以对句柄执行任何进一步的检查,以确认 dlopen 的调用是否成功?
【问题讨论】:
-
它是否在
nm中显示T或t?如果它显示t,则表示该函数未导出。方法名称中是否有前导下划线?您还应该在问题中显示nm输出。 -
添加到原帖(显示
T) -
能否提供一些有关您如何创建 .so 文件的信息?
-
使用cmake创建的库
ADD_LIBRARY, and 'SHARED' -
听起来应该很容易为共享对象和主程序提供 SSCCE (sscce.org)。您可以这样做并发布代码(以及您正在使用的构建命令)吗?