微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在共享库中使用应用程序类

如何解决在共享库中使用应用程序类

我正在尝试创建一个“游戏平台”,让用户可以选择要玩的游戏以及图形库来渲染它。这些游戏和图形库作为动态库实现,在运行时加载。我们将其称为游戏平台 Core。 共享库包含在运行时使用 RTLD_LAZY 标志加载的类,但是如果我使用 RTLD_Now 加载它,程序将正确编译。 我遵循了 this 教程以避免名称修改,并且像这样使用在共享库上定义的类。 目前,如果方法调用核心类的任何方法(只使用类的参数),它工作得很好。 (见下面的代码

// Working code

void libNCurses::refreshScreen(Core *core)
{
  if (core->input != Input::None)
        mvaddch(0,'c');
  else
        mvaddch(0,' ');
  refresh();
}

但是当我想调用 Core 类的某个方法时,程序会崩溃并抱怨未定义的符号(所用方法的符号)。 (见下面的代码

// Not working code

void libNCurses::refreshScreen(Core *core)
{
  std::vector<Object *> objs = core->getobjects();

  for (auto obj = objs.begin(); obj != objs.end(); obj++)
      mvaddch(10,10,'O');
  if (core->input != Input::None)
        mvaddch(0,' ');
  refresh();
}

当然核心头文件包含在共享库中。 任何人都可以向我解释为什么会发生这种情况以及如何解决它?

解决方法

好的,在阅读 Drepper's paper How to write shared libraries 后,我找到了问题所在。 在 C++ 中,这些方法没有链接。程序和库都没有其他链接的方法。补丁就是使用vtable。如果方法是虚拟的,程序会检查与对象相关的虚表,并在那里找到函数地址。 我可以使用 lib 的方法,因为为了避免名称修改,我使用了 lib 的接口,而不是其他方式。我希望这个答案对某人有所帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。