c++ LLVM编译器-未定义的引用

zzzyeukh  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(190)

我正在使用LLVM编写C++编译器。我已经实现了简单的数字和字符串。然而,当我试图编译程序时,我得到了一个构建错误。

  1. undefined reference to `llvm::BasicBlock::BasicBlock(llvm::LLVMContext&, llvm::Twine const&, llvm::Function*, llvm::BasicBlock*)'
  2. undefined reference to `llvm::ConstantInt::get(llvm::IntegerType*, unsigned long long, bool)'
  3. undefined reference to `llvm::Type::getInt32Ty(llvm::LLVMContext&)'
  4. undefined reference to `llvm::Type::getInt64Ty(llvm::LLVMContext&)'
  5. undefined reference to `llvm::Function::Create(llvm::FunctionType*, llvm::GlobalValue::LinkageTypes, llvm::Twine const&, llvm::Module&)'
  6. undefined reference to `llvm::outs()'

这不是真正的错误,只是其中的一部分。我得到了一堆未定义的引用。下面是我的代码生成器类的代码:

  1. #ifndef COMPILER_CODEGENERATION_H
  2. #define COMPILER_CODEGENERATION_H
  3. #include "llvm/IR/Module.h"
  4. #include "llvm/IR/IRBuilder.h"
  5. #include "llvm/IR/LLVMContext.h"
  6. #include "llvm/IR/Verifier.h"
  7. #include "llvm/IR/Function.h"
  8. #include "ASTNode.h"
  9. namespace COMPILER {
  10. class CodeGenerator {
  11. std::shared_ptr<llvm::Module> _module;
  12. std::shared_ptr<llvm::LLVMContext> _context;
  13. std::shared_ptr<llvm::IRBuilder<>> _irBuilder;
  14. llvm::BasicBlock * createBlock(const std::string &blockName, llvm::Function *targetFunc) {
  15. return llvm::BasicBlock::Create(*_context,blockName, targetFunc);
  16. }
  17. llvm::Function * createFunctionPrototype(const std::string &funcName, llvm::FunctionType *funcType) {
  18. auto proto = llvm::Function::Create(funcType, llvm::Function::ExternalLinkage, funcName, *_module);
  19. llvm::verifyFunction(*proto);
  20. return proto;
  21. }
  22. void createFunction(const std::string &funcName, llvm::FunctionType *funcType) {
  23. auto proto = createFunctionPrototype(funcName, funcType);
  24. auto block = createBlock("entry", proto);
  25. _irBuilder->SetInsertPoint(block);
  26. }
  27. public:
  28. CodeGenerator(
  29. const std::shared_ptr<llvm::Module> &module, const std::shared_ptr<llvm::LLVMContext> &context,
  30. const std::shared_ptr<llvm::IRBuilder<>> &builder
  31. ) {
  32. _module = module;
  33. _context = context;
  34. _irBuilder = builder;
  35. }
  36. // LLVM Value can represent anything. Eg. instructions, strings, numbers ...
  37. void Compile(const std::vector<std::unique_ptr<Compiler::IExpression>> &statementList) {
  38. createFunction("main", llvm::FunctionType::get(_irBuilder->getInt32Ty(), false));
  39. for(auto &expressionStatement: statementList) {
  40. expressionStatement->codegen(_module, _context, _irBuilder);
  41. }
  42. }
  43. };
  44. llvm::Value * Compiler::NumberExpressionNode::codegen(
  45. const std::shared_ptr<llvm::Module> &module,
  46. const std::shared_ptr<llvm::LLVMContext> &context,
  47. const std::shared_ptr<llvm::IRBuilder<>> &builder){
  48. return builder->getInt64(_num);
  49. }
  50. }
  51. #endif

您可以忽略头文件和名称空间名称,因为它们无关紧要。我的项目正在使用Windows 10和CLion。下面是我用来下载和编译LLVM的**命令。

  1. cd <path_where_the_files_will_be_installed>
  2. git clone --config core.autocrlf=false --depth 1 https://github.com/llvm/llvm-project.git
  3. cd llvm-project
  4. cd llvm
  5. mkdir build
  6. cd build
  7. cmake ..
  8. cmake --build . --config Debug --target INSTALL -j <number_of_cores>

这是我的CMakeLists

  1. cmake_minimum_required(VERSION 3.24)
  2. project(Compiler)
  3. set(CMAKE_CXX_STANDARD 17)
  4. find_package(LLVM REQUIRED CONFIG PATHS Dependencies/llvm/llvm-project/llvm/build NO_DEFAULT_PATH)
  5. include_directories(${LLVM_INCLUDE_DIRS})
  6. add_definitions(${LLVM_DEFINITIONS})
  7. add_executable(Compiler main.cpp compiler/src/Tokenization.h compiler/src/ASTNode.h compiler/src/Parser.h compiler/src/CodeGeneration.h compiler/src/Compiler.h)
  8. llvm_map_components_to_libnames(llvm_libs support core irreader)
  9. target_link_libraries(Compiler ${llvm_libs})

The code hirarchy

AST中的Earch节点有一个codegen()方法,在上面CodeGeneration文件中实现。
**有人可以帮助我解决这个错误吗?**Thanks:)

我已经尝试了下载和编译LLVM的不同方法,但没有一种有效。我还检查了正确的LLVM安装,并检查了我的CMakeLists.txt

cxfofazt

cxfofazt1#

我在Windows上使用LLVM基础设施时已经遇到了这个问题,并试图修复它,但没有任何效果。然后,我刚刚在Microsoft Store上安装了Ubuntu版本的WSL(Windows Subsystem for Linux)。最后,我用apt安装了LLVM和Clang,编译了我的项目,它工作了!

相关问题