C++ 如何停止在macOS共享库中重复QMetaObject定义?
以下C++ 如何停止在macOS共享库中重复QMetaObject定义?,c++,macos,qt,casting,C++,Macos,Qt,Casting,以下qobject_cast()在macOS 10.12.2/clang上失败(并在RHEL6/gcc上工作),因为我们的处理程序类有重复的QMetaObject定义: void AbstractDataView::getSelected() { qDebug() << Q_FUNC_INFO << QObject::sender() << QObject::sender()->metaObject() <&l
qobject_cast()
在macOS 10.12.2/clang上失败(并在RHEL6/gcc上工作),因为我们的处理程序
类有重复的QMetaObject
定义:
void AbstractDataView::getSelected()
{
qDebug() << Q_FUNC_INFO << QObject::sender()
<< QObject::sender()->metaObject()
<< &Handler::staticMetaObject;
Handler *h = qobject_cast<Handler*>(QObject::sender());
if(h)
this->getSelected(h);
else
qDebug() << "could not find handler to get selected data points"
<< h;
}
上述代码位于一个共享库插件中(通过我们的应用程序加载的Qt插件宏Q_DECLARE_INTERFACE
等实现);Handler
类(派生自QAction
)实例由可执行文件构造,并传递给共享库插件构造函数<代码>处理程序在内置于应用程序和共享库插件中的静态库中定义
似乎描述了我的问题,并建议我需要将处理程序定义编译到它自己的动态库中(而不是静态库)。因为这会引起很多麻烦:
- 这真的是我的问题吗:将
处理程序
移动到一个共享库并在应用程序和现有插件中动态加载它真的可以解决这个问题吗
- 真的没有更简单的方法来解决这个问题吗,特别是因为它在linux(RHEL6)上运行良好
如果有帮助的话,我可以提供CMakeList片段,但我认为这已经足够长了。我自己可以提供一个勉强令人满意的答案,但希望有人能提供一个更好的答案。简言之:
- 将
处理程序
移动到共享库确实有效。。。有点
- 我发现唯一“更简单”的解决方法是使用
reinterpret\u cast
。从某种意义上说,它“有效”,我没有发现直接的问题,但我也不相信它,事实证明,共享库解决方案只涉及很少的问题(我考虑使用动态加载而不是仅仅链接)
完成此操作后,我确实得到了一个QMetaObject:
DEBUG: void AbstractDataView::getSelected() Handler(0x7fa9eae0b9e0, name = "Export Metadata-7fa9eae0b9e0") 0x10e840350 0x10e840350
但是qobject\u cast
仍然失败!幸运的是,dynamic\u cast
确实有效(因此我有一些比reinterpret\u cast
更安全的方法),但我不能说我完全理解发生了什么
DEBUG: void AbstractDataView::getSelected() Handler(0x7fa9eae0b9e0, name = "Export Metadata-7fa9eae0b9e0") 0x10e840350 0x10e840350