HarmonyOS 鸿蒙Next平台上dynamic_cast转换失败的问题

HarmonyOS 鸿蒙Next平台上dynamic_cast转换失败的问题 有如下情况:

// ibase.h
class IBase()
{
public:
    virtual ~IBase() {}
};
// iderived.h
class IDerived : public IBase
{
public:
    virtual ~IDerived() {}
};
// 插件中的代码
// derived.h
class Derived : public IDerived
{
public:
    Derived();
    ~IDerived();
};
// derived.cpp
Derived::Derived()
{
}

Derived::~Derived()
{
}
// getbase.h
extern "C" {
IBase* getBase();
}
// getbase.cpp
IBase* getBase()
{
    return new Derived();
}
// 主程序
int main(int argc, char* argv[])
{
    // 动态加载插件,获取getBase的指针,调用它获取一个IBase*指针
    IBase* pBase = ...;
    IDerived* pDerived = dynamic_cast<IDerived*>(pBase);
    return ;
}

问题:在Windows平台上使用msvc编译和clang-cl编译,在Linux平台使用gcc编译和clang++编译,运行程序dynamic_cast转换都是成功的,pDerived不为空,但在鸿蒙平台上使用毕昇编译器编译,运行程序发现dynamic_cast转换失败,pDerived为空,如果插件中的代码放在一个普通的库中,dynamic_cast在鸿蒙平台上又是成功的,有人知道是什么原因吗,谢谢


更多关于HarmonyOS 鸿蒙Next平台上dynamic_cast转换失败的问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

在HarmonyOS Next平台上,dynamic_cast转换失败通常与RTTI(运行时类型识别)支持相关。鸿蒙Next默认限制了完整的C++ RTTI机制以优化性能,导致跨模块或共享库边界时类型信息丢失。需检查编译配置中是否启用了-frtti标志,并确保所有动态库使用统一的ABI和类型定义。若涉及ArkTS/ETS与C++交互,需通过OHOS接口明确类型映射,避免直接使用C++类型转换。

更多关于HarmonyOS 鸿蒙Next平台上dynamic_cast转换失败的问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next平台上出现dynamic_cast转换失败的问题,可能是由于RTTI(运行时类型信息)机制在跨动态库边界时的处理差异导致的。

从代码结构看,插件通过动态加载方式提供IBase指针,主程序尝试将其转换为IDerived。在Windows/Linux平台成功而在鸿蒙平台失败,这通常与编译器对RTTI的实现方式有关。

可能的原因:

  1. 类型信息符号可见性:毕昇编译器可能对跨动态库的RTTI有更严格的限制,需要确保虚函数表和类型信息在插件和主程序间正确共享
  2. 编译选项差异:检查是否在编译插件和主程序时都启用了RTTI支持(-frtti)
  3. 链接时优化:某些编译器在链接时可能对类型信息进行优化,导致跨库识别失败

建议检查:

  • 确认插件和主程序使用相同的编译器版本和编译标志
  • 确保所有虚函数声明一致,特别是析构函数
  • 考虑使用typeid操作符验证类型信息是否可用

这种问题在跨动态库边界进行类型转换时较为常见,与平台特定的ABI实现密切相关。

回到顶部