将LLVM链接至自定义编译器项目时出现未定义符号错误
解决LLVM链接阶段Undefined Symbols错误
从你给出的错误信息和CMake配置来看,问题出在没有将LLVM的必要库链接到你的可执行文件,同时你用到的LLVM组件也没有完全配置到位。
问题分析
你的CMakeLists.txt里已经通过llvm_map_components_to_libnames生成了包含LLVM组件库的变量llvm_libs,但没有告诉CMake把这些库链接到Seserot目标上。另外,你在代码中使用了IRBuilder、LLVMContext、Module等类,当前指定的LLVM组件(support core irreader)缺少了irbuilder组件,这也是部分符号找不到的原因。
修复步骤
1. 补全LLVM组件列表
修改llvm_map_components_to_libnames这一行,添加irbuilder组件(对应你使用的IRBuilder类):
llvm_map_components_to_libnames(llvm_libs support core irreader irbuilder)
如果后续你需要生成或写入LLVM IR模块,还可以添加bitwriter组件,提前配置避免后续报错。
2. 添加库链接指令
在add_executable语句之后,添加target_link_libraries来将LLVM库链接到你的可执行文件:
target_link_libraries(Seserot PRIVATE ${llvm_libs})
修改后的完整CMakeLists.txt关键部分
# 之前的配置不变... # Find the libraries that correspond to the LLVM components # that we wish to use llvm_map_components_to_libnames(llvm_libs support core irreader irbuilder) # Link against LLVM libraries add_executable(Seserot src/main.cpp src/Lexer.cpp src/ErrorTable.cpp src/CompilerError.cpp src/Parser.cpp src/BuildIn.cpp src/AbstractSyntaxTreeNode.cpp src/ByteCodeWriter.cpp src/Symbol.cpp) # 新增:链接LLVM库 target_link_libraries(Seserot PRIVATE ${llvm_libs})
为什么这样能解决问题
- 补全组件:
irbuilder组件包含了IRBuilder相关的实现代码,解决了IRBuilderFolder、ConstantFolder等符号未定义的问题。 - 添加链接指令:
target_link_libraries告诉链接器在生成可执行文件时,将指定的LLVM库与你的代码合并,从而找到所有LLVM相关的函数和类实现。
另外,确保你安装的LLVM 16.0.0git是针对arm64架构编译的(和你的Mac架构匹配),不过从错误信息来看,主要问题还是链接配置缺失,修复上面的CMake配置应该就能解决问题。
内容的提问来源于stack exchange,提问作者zly2006
相关产品推荐
相关产品推荐

