在共享库中使用应用程序 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 的接口,但不是以其他方式。我希望这个答案对某人有所帮助。
我正在尝试创建一个“游戏平台”,让用户可以选择要玩的游戏以及用于呈现游戏的图形库。这些游戏和图形库作为 动态库 实现,在 运行 时加载。我们将游戏平台称为 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 的接口,但不是以其他方式。我希望这个答案对某人有所帮助。