2017-06-19 289 views
2

我正在構建一個編譯器。我已經使用bnfc編寫了一個語法和一個TypeChecker。現在我想使用llvm使用由bnfc生成的抽象語法樹來生成llvm IR代碼。 LLVM的教程說編譯如下:Makefile:編譯一個llvm程序作爲g ++編譯後的bnfc項目的一部分

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

什麼是g ++命令,做同樣的事情,並生成.o目標文件文件,而不是一個程序的?

另外一個對上述問題的回答我也很感激其他方法使makefile下面的工作。

makefile文件

在這裏,我有我的makefile電流,這是不行的,因爲很明顯鐺和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 
+0

我認爲這是如果你只是在你滿意的時候發佈你的問題,那麼更好,而且它是完整的,而不是一半的問題。 – Rakete1111

+0

這有點時間敏感。我應該刪除它併發布完整的版本嗎? – KarlKastor

+0

我認爲現在很好,但只是對未來的單挑。 – Rakete1111

回答

1

好吧,我現在自己找到了解決辦法,並會留下我在這裏爲後人作品的生成文件:(主要是,我剛剛更換鐺++與g ++以及使用g ++使用LLCONFIG

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 
1

我懷疑,${LLCONFIG}應該來在最後一個環節的命令,那就是在TestCodeGenerator規則。您還需要玩其相對於其他目標文件的位置。

+0

謝謝!我會在今天晚些時候完成另一個不相關的項目時,檢查是否可以這樣工作。 – KarlKastor