编译LLVM 15.0.2时遇抽象类实例化错误如何解决?
LLVM 15.0.2编译Sparc后端抽象类错误的解决方法
错误原因
报错提示ELFSparcAsmBackend是抽象类无法实例化,本质是该类存在未实现的纯虚函数——父类(如MCAsmBackend或ELFAsmBackend)中声明的必须实现的虚函数,在ELFSparcAsmBackend中没有完成定义,导致编译器禁止创建对象。
解决步骤
- 定位
ELFSparcAsmBackend类定义,梳理父类要求实现的所有纯虚函数。LLVM目标后端的AsmBackend通常需要实现writeNopData、getFixupKindInfo、applyFixup等核心方法。 - 补全所有缺失的纯虚函数实现。比如针对Sparc架构补全NOP指令写入逻辑:
void ELFSparcAsmBackend::writeNopData(raw_ostream &OS, uint64_t Count) const { // Sparc 32位NOP指令为0x01000000,64位需对应调整 const uint8_t Nop32[] = {0x01, 0x00, 0x00, 0x00}; while (Count >= sizeof(Nop32)) { OS.write(reinterpret_cast<const char*>(Nop32), sizeof(Nop32)); Count -= sizeof(Nop32); } } - 对比LLVM官方15.0.2版本的
SparcAsmBackend.cpp源码,检查是否在CCR项目修改过程中误删了ELFSparcAsmBackend的必要方法实现,补全差异部分。 - 验证构造函数参数匹配性:确认
ELFSparcAsmBackend的构造函数签名,和new表达式中的参数(目标Triple的OS类型等)完全一致,避免因参数不匹配导致编译器误判为抽象类。
内容的提问来源于stack exchange,提问作者NobinPegasus
相关产品推荐
相关产品推荐

