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

Use of application class within shared library

本文关键字:应用程序 共享      更新时间:2024-05-23

我正在尝试创建一个;游戏平台";允许用户选择要玩的游戏以及要渲染的图形库。这些游戏和图形库被实现为运行时加载的动态库。我们将把游戏平台称为Core。共享库包含在运行时使用RTLD_LAZY标志加载的类,但是,如果使用RTLD_NOW加载,程序将正确编译。我遵循本教程是为了避免名称混乱,并像这样使用在共享库上定义的类。目前,如果方法不调用Core类的任何方法(只使用该类的参数(,它就可以正常工作。(参见下面的代码(

// Working code
void libNCurses::refreshScreen(Core *core)
{
if (core->input != Input::None)
mvaddch(0,0,'c');
else
mvaddch(0,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,0,'c');
else
mvaddch(0,0,' ');
refresh();
}

当然,Core标头包含在共享库中。有人可以向我解释为什么会发生这种情况,以及如何解决?

好吧,在阅读了Drepper的论文如何编写共享库之后,我发现了问题所在。在C++中,方法是不链接的。程序和库都没有链接其他程序的方法。该补丁将使用vtable。如果该方法是虚拟的,程序会检查与对象相关的vtable,并在那里找到函数地址。我可以使用lib的方法,因为为了避免名称混乱,我为lib使用了一个接口,但不是相反。我希望这个答案能帮助到别人。