在共享库中使用应用程序类
Use of application class within shared library
我正在尝试创建一个;游戏平台";允许用户选择要玩的游戏以及要渲染的图形库。这些游戏和图形库被实现为运行时加载的动态库。我们将把游戏平台称为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使用了一个接口,但不是相反。我希望这个答案能帮助到别人。
相关文章:
- Qt - 共享同一数据库的应用程序
- 使用 IPC 共享内存的应用程序是否可以访问彼此的代码?
- 在 API 和应用程序线程之间共享数据
- 将函数从控制台应用程序移动到共享库项目似乎会带来不相关的编译错误
- 共享对象与提升program_options静态链接;应用程序链接共享
- Qt应用程序在运行时找不到共享库
- 尝试使用共享库部署QT应用程序时出错
- 如何将 #defines 从 c++ 共享库导出到应用程序
- 在Linux中使用gcc 4.1编译的C++03应用程序中使用C++11共享库
- 在应用程序和驱动程序之间共享内存
- 在Windows 8上共享应用程序URI方案注册
- SFML2 应用程序找不到共享对象
- VC++和Qt应用程序之间使用共享内存进行通信
- 管理多线程应用程序中的共享变量
- 交叉编译用于树莓派的QT应用程序-无法打开共享对象文件
- 如何与其他应用程序共享 HGLOBAL?
- 获取包含共享库的c++应用程序的调用堆栈
- 带有API的WinRT应用程序,该应用程序使用共享的MFC dll
- 如何在C++中通过我的应用程序共享"this"实例?
- 寻找与不同的c++应用程序共享c++函数的不同方法