如何解决LLVMLinkInMCJIT函数未定义引用错误?
修复LLVM MCJIT的
LLVMLinkInMCJIT未定义引用错误 问题描述
引入LLVM的MCJIT.h头文件后,出现如下链接错误:
/usr/bin/ld: CMakeFiles/vm-llvm-example.dir/example/main.cpp.o: in function `_GLOBAL__sub_I_main.cpp': /home/pegasus/Documents/llvm-project/llvm/include/llvm/ExecutionEngine/MCJIT.h:35:(.text.startup+0x25e): undefined reference to `LLVMLinkInMCJIT'
错误指向MCJIT.h中的extern "C" void LLVMLinkInMCJIT();声明,提示该函数的定义缺失。
原因分析
MCJIT.h中通过一个全局结构体的构造函数,在程序启动时尝试调用LLVMLinkInMCJIT(),目的是强制链接MCJIT组件(避免编译器优化掉未直接引用的代码)。但这个函数的定义并不在头文件中,而是存在于LLVM的MCJIT运行时库里,如果编译时没有链接对应的库,链接器就会找不到该函数的实现。
修复方案
方案1:使用CMake构建(推荐)
利用LLVM官方提供的CMake模块,自动处理依赖库的链接:
# 查找LLVM配置 find_package(LLVM REQUIRED CONFIG) # 添加LLVM的头文件路径和编译定义 include_directories(${LLVM_INCLUDE_DIRS}) add_definitions(${LLVM_DEFINITIONS}) # 构建你的可执行文件 add_executable(vm-llvm-example example/main.cpp) # 链接MCJIT及相关依赖库 target_link_libraries(vm-llvm-example PRIVATE LLVMExecutionEngine LLVMMCJIT LLVMCore LLVMSupport # 根据你的代码需求,添加其他必要的LLVM库 )
方案2:手动编译链接
如果直接用编译器命令行编译,需要通过llvm-config获取正确的链接参数,显式链接MCJIT相关库:
clang++ main.cpp -o vm-llvm-example `llvm-config --cxxflags --ldflags --libs executionengine mcjit core support`
解释:
llvm-config --cxxflags:输出LLVM的编译参数llvm-config --ldflags:输出LLVM的链接路径参数llvm-config --libs executionengine mcjit core support:输出需要链接的LLVM库列表,其中executionengine和mcjit就是包含LLVMLinkInMCJIT定义的库
内容的提问来源于stack exchange,提问作者NobinPegasus
相关产品推荐
相关产品推荐

