c++ - Makefile:将 llvm 程序编译为 g++ 编译的 bnfc 项目的一部分

标签 c++ makefile g++ llvm clang++

我正在构建一个编译器。我已经使用 bnfc 编写了语法和类型检查器。现在我想使用 llvm 使用 bnfc 生成的抽象语法树来生成 llvm IR 代码。 llvm 教程说要像这样编译:

clang++ -g -O3 toy.cpp `llvm-config --cxxflags --ldflags --system-libs --libs core` -o toy

执行相同操作并生成 .o 目标文件而不是程序的 g++ 命令是什么?

除了回答上述问题之外,我也希望有其他方法可以使下面的 makefile 正常工作。

生成文件

这里我有我当前的 makefile,它不起作用,因为显然 clang 和 g++ 不能一起工作:

(问题出在CodeGenerator.o)

CC = g++
CCFLAGS = -std=c++11 -g -w

FLEX = flex
FLEX_OPTS = -PCPP

BISON = bison
BISON_OPTS = -t -pCPP

LLCLANG = clang++
LLCONFIG = -g `llvm-config --cxxflags --ldflags --system-libs --libs core`

OBJS = Absyn.o Lexer.o Parser.o Printer.o TypeChecker.o CodeGenerator.o

.PHONY: clean distclean

all: TestCodeGenerator

TestCodeGenerator: ${OBJS} cgcpp.o
    @echo "Linking cgcpp..."
    ${CC} ${CCFLAGS} ${OBJS} cgcpp.o -o cgcpp

Absyn.o: Absyn.C Absyn.H
    ${CC} ${CCFLAGS} -c Absyn.C

Lexer.C: CPP.l
    ${FLEX} -oLexer.C CPP.l

Parser.C: CPP.y
    ${BISON} CPP.y -o Parser.C

Lexer.o: Lexer.C Parser.H
    ${CC} ${CCFLAGS} -c Lexer.C

Parser.o: Parser.C Absyn.H
    ${CC} ${CCFLAGS} -c Parser.C

Printer.o: Printer.C Printer.H Absyn.H
    ${CC} ${CCFLAGS} -c Printer.C


cgcpp.o: cgcpp.C Parser.H Printer.H Absyn.H TypeChecker.H CodeGenerator.H
    ${CC} ${CCFLAGS} -c cgcpp.C

CodeGenerator.o: 
    ${LLCLANG} ${LLCONFIG} -c  CodeGenerator.C

错误消息

这是我得到的错误:

CodeGenerator.o: In Funktion `std::default_delete<llvm::Module>::operator()(llvm::Module*) const':
/usr/include/c++/5/bits/unique_ptr.h:76: Nicht definierter Verweis auf `llvm::Module::~Module()'
CodeGenerator.o: In Funktion `llvm::MetadataTracking::untrack(llvm::Metadata*&)':
/usr/lib/llvm-3.8/include/llvm/IR/Metadata.h:243: Nicht definierter Verweis auf `llvm::MetadataTracking::untrack(void*, llvm::Metadata&)'
CodeGenerator.o: In Funktion `_GLOBAL__sub_I_CodeGenerator.C':
/home/username/Schreibtisch/Compilerbau/3._Codegenerator/CodeGenerator.C:21: Nicht definierter Verweis auf `llvm::LLVMContext::LLVMContext()'
/home/username/Schreibtisch/Compilerbau/3._Codegenerator/CodeGenerator.C:21: Nicht definierter Verweis auf `llvm::LLVMContext::~LLVMContext()'
collect2: error: ld returned 1 exit status
Makefile:26: die Regel für Ziel „TestCodeGenerator“ scheiterte
make: *** [TestCodeGenerator] Fehler 1

从德语大致翻译:

CodeGenerator.o: In Function `std::default_delete<llvm::Module>::operator()(llvm::Module*) const':
/usr/include/c++/5/bits/unique_ptr.h:76: undefined reference to `llvm::Module::~Module()'
CodeGenerator.o: In function `llvm::MetadataTracking::untrack(llvm::Metadata*&)':
/usr/lib/llvm-3.8/include/llvm/IR/Metadata.h:243: undefined reference to `llvm::MetadataTracking::untrack(void*, llvm::Metadata&)'
CodeGenerator.o: In Function `_GLOBAL__sub_I_CodeGenerator.C':
/home/username/desktop/Compilerbau/3._Codegenerator/CodeGenerator.C:21: Undefined reference to `llvm::LLVMContext::LLVMContext()'
/home/username/desktio/Compilerbau/3._Codegenerator/CodeGenerator.C:21: Undefined reference to  `llvm::LLVMContext::~LLVMContext()'
collect2: error: ld returned 1 exit status
Makefile:26: the rule for „TestCodeGenerator“ failed
make: *** [TestCodeGenerator] Error 1

最佳答案

我怀疑,${LLCONFIG}应该出现在最终的链接命令中,即TestCodeGenerator规则中。您还需要调整它相对于其他对象文件的位置。

关于c++ - Makefile:将 llvm 程序编译为 g++ 编译的 bnfc 项目的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44633686/

相关文章:

c++ - 涉及继承、指针对象释放以及何时释放的问题

c++ - 在多线程 C++11 程序中未处理异常时会发生什么?

python - 从源代码安装Python 3.1.2,如何解决sqlite3-dev依赖关系?

php - 在 RHEL 6 上编译 `mysql_pdo` 驱动程序(无法访问互联网,没有 `yum install` )

windows - 如何在Windows中安装和使用 "make"?

c++ - ubuntu 上缺少 QWT 安装文件

c++ - 连接两个程序,一个使用 main(),一个使用 WinMain()

C++回调函数运行时错误

c++ - MSVC 中的 "vector<bool> iterator not dereferencable"错误但使用 g++ 编译时工作正常

c++ - 使用 g++ 避免 C++ 程序中的小页面错误