我在项目中使用C++/Qt,我遇到了这个奇怪的问题。
我的应用程序在任何本机Linux机器和Windows上运行良好。当我使用远程 Linux 机器执行我的程序并使用 X Windows 服务器(我使用 Xming)查看/使用它时,会出现问题。调试器指向dynamic_cast无法获取对象指针(强制转换返回一个漂亮的 NULL)而不是我想要的实际对象的行。
我怀疑必须缺少一些配置问题才能启用这些运行时检查。
任何人都遇到过这样的问题,任何关于解决方案的指示都将受到欢迎。
你们是如何链接的? 我们的Java也有类似的问题插件。 如果dynamic_cast
位于与在其中构造对象的 DLL,必须设置RTLD_GLOBAL
在调用中dlopen
加载 DLL 的时间。 如果 DLL隐式加载,是否设置将取决于它如何是为触发加载的 DLL 设置的(这意味着您可能无法控制它)。 最后,我们必须确保不 .so
是隐式加载的(通过让 Java 加载一个特殊的加载器 DLL,它显式加载所有内容,在依赖顺序)。
请注意,这可能不是您的问题;我只是猜测,因为我没有足够的信息。 但我们有完全相同的症状。
好的,经过大量试验,这就是解决方案。
我需要显式导出接口类,使用属性((可见性("默认")))为了确保 vtable 中有一个条目,为此定义并清空虚拟析构函数。
似乎在某些 Linux 机器上,如果我不导出它无法识别 RTTI,并返回 NULL。