gpt4 book ai didi

c++ - LLVM 代码生成链接器错误

转载 作者:行者123 更新时间:2023-11-30 03:58:51 24 4
gpt4 key购买 nike

我正在为 Decaf 语言编写编译器。我完成了词法分析器 (flex) 和解析器 (bison)。此外,我还生成了 AST 并实现了类型检查。我现在正在尝试使用 LLVM IR 实现代码生成。

但是,在链接文件时,g++ 会抛出错误,说它找不到 llvm::getGlobalContext() 等。

g++ -O2 -Wno-write-strings -std=c++11 `llvm-config --cxxflags` -c ast.cc
bison -d -t -y --verbose parser.y
g++ -O2 -Wno-write-strings -std=c++11 `llvm-config --cxxflags` y.tab.c -c
flex -8 lexer.l
g++ -O2 -Wno-write-strings -std=c++11 `llvm-config --cxxflags` lex.yy.c -c -lfl
g++ -O2 -Wno-write-strings -std=c++11 `llvm-config --cxxflags` -c symtable.cc
g++ -O2 -Wno-write-strings -std=c++11 `llvm-config --cxxflags` ast.o lex.yy.o y.tab.o symtable.o -o dcc -lfl
ast.o: In function `IntegerConstant::Codegen()':
ast.cc:(.text._ZN15IntegerConstant7CodegenEv+0x6): undefined reference to `llvm::getGlobalContext()'
ast.cc:(.text._ZN15IntegerConstant7CodegenEv+0xe): undefined reference to `llvm::Type::getInt64Ty(llvm::LLVMContext&)'
ast.cc:(.text._ZN15IntegerConstant7CodegenEv+0x1f): undefined reference to `llvm::ConstantInt::get(llvm::IntegerType*, unsigned long, bool)'
ast.o: In function `CharConstant::Codegen()':
ast.cc:(.text._ZN12CharConstant7CodegenEv+0x7): undefined reference to `llvm::getGlobalContext()'
ast.cc:(.text._ZN12CharConstant7CodegenEv+0xf): undefined reference to `llvm::Type::getInt64Ty(llvm::LLVMContext&)'
ast.cc:(.text._ZN12CharConstant7CodegenEv+0x20): undefined reference to `llvm::ConstantInt::get(llvm::IntegerType*, unsigned long, bool)'
ast.o: In function `BooleanConstant::Codegen()':
ast.cc:(.text._ZN15BooleanConstant7CodegenEv+0x6): undefined reference to `llvm::getGlobalContext()'
ast.cc:(.text._ZN15BooleanConstant7CodegenEv+0xe): undefined reference to `llvm::Type::getInt64Ty(llvm::LLVMContext&)'
ast.cc:(.text._ZN15BooleanConstant7CodegenEv+0x1f): undefined reference to `llvm::ConstantInt::get(llvm::IntegerType*, unsigned long, bool)'
ast.o: In function `_GLOBAL__sub_I_ast.cc':
ast.cc:(.text.startup._GLOBAL__sub_I_ast.cc+0x2b): undefined reference to `llvm::getGlobalContext()'
collect2: error: ld returned 1 exit status
Makefile:12: recipe for target 'dcc' failed
make: *** [dcc] Error 1

我在 ast.h 中包含了 LLVM 头文件,其他地方都没有(因为我只在 ast.cc 中调用 codegen() 方法

如果有帮助,我很乐意提供更多背景信息。此外,如果我注释掉 llvm 部分(目前在我的 AST 中仅包括几个用于整数/ bool /字符常量类的代码生成函数),项目编译没有错误。

这是我的 Makefile,如果有帮助的话:

CCC = g++
CCFLAGS= -O2 -Wno-write-strings -std=c++11
LLVMFLAGS = `llvm-config --cxxflags`
LEX = flex
LFLAGS= -8
YACC= bison
YFLAGS= -d -t -y --verbose

RM = /bin/rm -f

dcc: ast.o y.tab.o lex.yy.o symtable.o
${CCC} ${CCFLAGS} ${LLVMFLAGS} ast.o lex.yy.o y.tab.o symtable.o -o dcc -lfl

symtable.o: symtable.h symtable.cc
${CCC} ${CCFLAGS} ${LLVMFLAGS} -c symtable.cc

ast.o: ast.cc ast.h
${CCC} ${CCFLAGS} ${LLVMFLAGS} -c ast.cc

y.tab.o: parser.y
${YACC} ${YFLAGS} parser.y
${CCC} ${CCFLAGS} ${LLVMFLAGS} y.tab.c -c

lex.yy.o: lexer.l
${LEX} $(LFLAGS) lexer.l
${CCC} ${CCFLAGS} ${LLVMFLAGS} lex.yy.c -c -lfl

clean:
/bin/rm -f lex.yy.* y.tab.* *.o *.output dcc

请帮忙。

编辑 1:

我已经在 ast.h 中定义了虚拟 Codegen() 函数,并在 ast.cc 中定义了它们的实现

我在用

using namespace llvm;

Value *ErrorV(const char *Str) { return 0; }

static Module *TheModule;
static IRBuilder<> Builder(getGlobalContext());
static std::map<std::string, Value*> NamedValues;

Value *IntegerConstant::Codegen() {
return ConstantInt::get(Type::getInt64Ty(getGlobalContext()), val_, true);
}

在 ast.cc 的末尾(因为我写的所有其他函数都在

using namespace std;

最佳答案

要链接,您需要“llvm-config --ldflags --libs”。我建议在您的 LLVMFLAGS 变量中同时使用所有三个标志。

关于c++ - LLVM 代码生成链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27212933/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com