LLVM TargetRegistry无目标问题求助:lookupTarget失败且targets为空
解决LLVM TargetRegistry查找失败且targets为空的问题
看起来你碰到了LLVM目标注册的典型问题——TargetRegistry里空空如也,自然找不到你要的i686-pc-windows-msvc目标啦。别担心,这是因为你漏掉了目标后端的初始化步骤,我来给你一步步解决:
问题根源
LLVM的各类目标架构(比如X86、ARM)并不会默认自动加载到你的程序中,尤其是当你使用静态链接LLVM或者手动编译LLVM时,必须显式初始化对应架构的目标后端,否则TargetRegistry里根本没有任何可查询的目标。
具体解决步骤
1. 在代码中显式初始化X86目标后端
你的目标三元组是i686-pc-windows-msvc,属于X86架构,所以需要在原有代码前添加X86目标的初始化代码:
#include "llvm/TargetParser/Host.h" #include "llvm/Target/TargetRegistry.h" // 引入X86目标相关头文件 #include "llvm/Target/X86/X86TargetMachine.h" #include "llvm/TargetParser/X86TargetParser.h" int main() { // 关键:初始化X86目标的核心组件 llvm::InitializeX86Target(); llvm::InitializeX86TargetInfo(); llvm::InitializeX86TargetMC(); llvm::InitializeX86AsmPrinter(); llvm::InitializeX86AsmParser(); // 你的原有代码 auto const targetTriple = llvm::sys::getDefaultTargetTriple(); llvm_module.setTargetTriple(targetTriple); std::string error; auto const * target = llvm::TargetRegistry::lookupTarget(targetTriple, error); if (target == nullptr) { auto targets = llvm::TargetRegistry::targets(); size_t targetCount = 0; for (auto const &_ : targets) { ++targetCount; } ERROR(Unknown, "llvm::TargetRegistry::lookupTarget failed for " + targetTriple + ". llvm::TargetRegistry::targets() contains " + std::to_string(targetCount) + " elements."); } }
这些InitializeXxx函数会把X86架构的目标信息注册到TargetRegistry中,之后targets()就能返回对应的元素了。
2. 确保链接时包含LLVM的X86目标库
如果用CMake构建项目,需要在CMakeLists.txt中添加X86相关组件的链接配置:
find_package(LLVM REQUIRED CONFIG) include_directories(${LLVM_INCLUDE_DIRS}) add_definitions(${LLVM_DEFINITIONS}) # 映射X86相关组件到库名 llvm_map_components_to_libnames(llvm_libs X86CodeGen X86AsmParser X86AsmPrinter X86Desc X86Info) # 链接到你的项目 target_link_libraries(你的项目名称 ${llvm_libs})
如果是手动编译链接,要把LLVM的X86静态库(比如LLVMX86CodeGen.a、LLVMX86AsmPrinter.a等)加入链接参数。
3. 通用场景提示
如果你的程序需要支持多架构而非仅X86,可以调用全局初始化函数:
llvm::InitializeAllTargets(); llvm::InitializeAllTargetInfos(); llvm::InitializeAllTargetMCs(); llvm::InitializeAllAsmPrinters(); llvm::InitializeAllAsmParsers();
不过这样会增加程序体积,所以如果只需要特定架构,优先初始化对应架构的目标更高效。
内容的提问来源于stack exchange,提问作者Brent
相关产品推荐
相关产品推荐

