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