Makefile:编译 llvm 程序作为 g++ 编译的 bnfc 项目的一部分
Makefile: Compiling a llvm program as part of an g++ compiled bnfc project
我正在构建一个编译器。我已经使用 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
这是我当前的 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}
应该出现在最终的 link 命令中,即在 TestCodeGenerator
规则中。您还需要研究它相对于其他目标文件的位置。
好的,我现在自己找到了解决方案,并将为后代留下适合我的 makefile:(主要是,我只是用 g++ 替换了 clang++ 并使用了 LLCONFIG
和 g++)
CC = g++
CCFLAGS = -std=c++11 -g -w
FLEX = flex
FLEX_OPTS = -PCPP
BISON = bison
BISON_OPTS = -t -pCPP
LLCLANG = clang++ -stdlib=libc++
LLCONFIG = -g `llvm-config --cxxflags --ldflags --system-libs --libs core`
OBJS = Absyn.o Lexer.o Parser.o Printer.o TypeChecker.o CodeGenerator.o
TestCodeGenerator: ${OBJS} cgcpp.o
@echo "Linking cgcpp..."
${CC} ${OBJS} cgcpp.o ${LLCONFIG} -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} ${LLCONFIG} -c cgcpp.C
CodeGenerator.o:
${CC} ${CCFLAGS} ${LLCONFIG} -c CodeGenerator.C
我正在构建一个编译器。我已经使用 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
这是我当前的 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}
应该出现在最终的 link 命令中,即在 TestCodeGenerator
规则中。您还需要研究它相对于其他目标文件的位置。
好的,我现在自己找到了解决方案,并将为后代留下适合我的 makefile:(主要是,我只是用 g++ 替换了 clang++ 并使用了 LLCONFIG
和 g++)
CC = g++
CCFLAGS = -std=c++11 -g -w
FLEX = flex
FLEX_OPTS = -PCPP
BISON = bison
BISON_OPTS = -t -pCPP
LLCLANG = clang++ -stdlib=libc++
LLCONFIG = -g `llvm-config --cxxflags --ldflags --system-libs --libs core`
OBJS = Absyn.o Lexer.o Parser.o Printer.o TypeChecker.o CodeGenerator.o
TestCodeGenerator: ${OBJS} cgcpp.o
@echo "Linking cgcpp..."
${CC} ${OBJS} cgcpp.o ${LLCONFIG} -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} ${LLCONFIG} -c cgcpp.C
CodeGenerator.o:
${CC} ${CCFLAGS} ${LLCONFIG} -c CodeGenerator.C