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

Use of application class within shared library

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

// Working code

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

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

// 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,0,'c');
  else
        mvaddch(0,0,' ');
  refresh();
}

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

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